2017-04-06 111 views
0

我正在使用Docker来准备好我的微服务体系结构。 我正在尝试使用docker-compose将一个容器与另一个容器链接起来。使用Docker组合Docker中的容器组合问题

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

所以我设置的码头工人,compose.yml一个链接,引用分贝容器IP作为使用“DB”:

- "JAVA_OPTS=-Dpostgres.host=db"

但是我发现了以下错误先从微服务泊坞窗:

产生的原因:java.lang.IllegalArgumentException异常:无法解析的价值占位符 'postgress.host' “的jdbc:在PostgreSQL:// $ {} postgress.host:5432 /泊坞窗”

所以基本上这个占位符不能解决,但通常码头组成应该照顾设置这个系统变量指向db容器IP地址对吗?

我在做什么错了?

下面涉及到的文件:

泊坞窗,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 
+0

这不是解决占位符,这是java代码没有选择你的选项,而不是docker和docker-compose提供的DNS解析。 – BMitch

+0

但是,这是将容器彼此链接的唯一方法吗?我的意思是,没有在这里做他的工作的是docker-compose,而不是将系统变量设置为正确的值,以便可以解决占位符。任何其他方式来做我所需要的? – fgonzalez

+0

你知道环境变量没有定义吗?在你的“微服务”容器ID上尝试一个'docker exec -i $ container_id env'。如果环境变量正在被定义,那么问题在于java没有使用它。 – BMitch

回答

0

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

链接服务的容器将可在与别名相同的主机名 或服务名称(如果未指定别名)中访问。

+0

没有运气,但谢谢,我刚刚发现JAVA_OPTS可能只在使用tomcat映像时才起作用。在我的情况下,我正在部署一个带有嵌入式tomcat的springboot fat jar,所以也许这就是系统变量没有设置的原因 – fgonzalez