【问题标题】:Issue linking containers in Docker using Docker-compose使用 Docker-compose 在 Docker 中链接容器问题
【发布时间】:2017-09-02 03:07:25
【问题描述】:

我正在使用 Docker 来准备我的微服务架构。 我在尝试使用 docker-compose 将一个容器与另一个容器链接时遇到了一些问题。

基本上我有一个用于 postgressql 映像的容器,以及一个使用 spring boot 开发的 java 微服务,它应该连接到数据库容器。

所以我在 docker-compose.yml 中设置了一个链接,并使用以下方法将 db 容器 ip 引用为“db”:

- "JAVA_OPTS=-Dpostgres.host=db"

但是,使用 docker 启动微服务时出现以下错误:

原因:java.lang.IllegalArgumentException:无法解析值“jdbc:postgresql://${postgress.host}:5432/docker”中的占位符“postgress.host”

所以基本上这个占位符无法解析,但通常 docker-composed 应该注意将此系统变量设置为指向 db 容器 IP 地址对吗?

我做错了什么?

相关文件下方:

docker-compose.yml:

    version: "2"
services:
  microservices:
      build: ./microservices
      container_name: microservices
      links:
        - db
        - consul
      environment:
        - "JAVA_OPTS=-Dpostgres.host=db"
  consul:
      image: consul
      container_name: consul
      ports:
                - "8500:8500"
  db:
    image: postgres
    container_name: local-postgres9.6
    ports:
          - "5432:5432"
    environment:
      POSTGRES_PASSWORD: docker
      POSTGRES_USER: docker

微服务的application.yml:

    server:
  port: 8081

project:
  jdbc:
    url: jdbc:postgresql://${postgres.host}:5432/docker
    driver: org.postgresql.Driver
    username: docker
    password: docker

【问题讨论】:

  • 它没有解析占位符,这是 java 代码没有选择你的选项,不是 docker 和 docker-compose 提供的 DNS 解析。
  • 但这是将容器相互链接的唯一方法对吧?我的意思是,这里没有做他的工作的是 docker-compose,没有将系统变量设置为正确的值,以便可以解析占位符。还有其他方法可以做我需要的吗?
  • 你知道环境变量没有定义吗?在您的“微服务”容器 ID 上尝试 docker exec -i $container_id env。如果环境变量正在被定义,那么问题是 java 没有使用它。

标签: java postgresql docker spring-boot docker-compose


【解决方案1】:

试试${db.host},根据documentation

链接服务的容器可以通过主机名访问 与别名相同,如果未指定别名,则与服务名称相同。

【讨论】:

  • 不走运,但谢谢,我刚刚发现 JAVA_OPTS 可能仅在使用 tomcat 图像时才有效。在我的情况下,我正在部署一个带有嵌入式 tomcat 的 springboot fat jar,所以也许这就是系统变量没有设置的原因
猜你喜欢
  • 1970-01-01
  • 2018-02-11
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多