【发布时间】: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