Java Docker:Springboot容器无法连接到PostgreSql容器
我正在构建一个使用PostgreSQL和docker compose的Spring启动应用程序。 当我使用docker compose up--build运行容器时,我的Spring Boot应用程序无法启动,因为它找不到PostgreSQL容器的主机名 弹簧靴Dockerfile docker-compose.yml 应用程序属性 错误输出Java Docker:Springboot容器无法连接到PostgreSql容器,java,postgresql,spring-boot,docker,docker-compose,Java,Postgresql,Spring Boot,Docker,Docker Compose,我正在构建一个使用PostgreSQL和docker compose的Spring启动应用程序。 当我使用docker compose up--build运行容器时,我的Spring Boot应用程序无法启动,因为它找不到PostgreSQL容器的主机名 弹簧靴Dockerfile docker-compose.yml 应用程序属性 错误输出 原因:java.net.UnknownHostException:db 我猜docker compose的虚拟网络还没有在Spring Boot Dock
原因:java.net.UnknownHostException:db
我猜docker compose的虚拟网络还没有在Spring Boot Dockerfile的构建阶段创建。
有没有办法解决这个问题?这里有很多信息:
在web容器中,到db的连接字符串如下所示
postgres://db:5432,并从主机中获取连接字符串
看起来像postgres://{DOCKER_IP}:8001
这意味着在docker-compose.yaml中使用db:5432很好,IP地址将被传递(不是“db”),但是在应用程序代码中外部使用它是行不通的。但是,您可以将docker compose.yamldb
作为应用程序输入变量传递,应用程序可以在配置文件中填充该变量。这将使您能够连接
像这样的外部化配置是相当常见的做法,因此应该是一个相对容易的解决方案
例如:
Docker-compose.yaml
version: '3'
services:
db:
container_name: db
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: my_db
ports:
- "5432:5432"
volumes:
- db-data:/var/lib/postgresql/data
networks:
- db-network
restart: always
server:
build: './server'
depends_on:
- db
environment:
DB_HOST: db # untested, but there should be a way to pass this in
DB_PORT: 5432
DB_DATABASE: my_db
DB_USER: postgres
DB_PASSWORD: postgres
restart: always
ports:
- "9000:9000"
networks:
- db-network
volumes:
- ./server:/server
networks:
db-network:
volumes:
db-data:
然后在src/main/java/resources/application.properties下有一个application.properties文件
spring.datasource.url=jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_DATABASE}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
完全解决了我的问题。
事实证明,maven在构建.jar文件时试图建立与数据库的连接。我所要做的就是用这一行修改我的DockerfileRUN mvn-f/usr/src/app/pom.xml clean package-DskipTests
我尝试了你的解决方案,但环境变量甚至没有加载。我得到了错误java.net.UnknownHostException:${DB_HOST}
,好像application.properties没有用DB
替换${DB_HOST}
这是在容器中旋转时发生的吗?您可以使用docker exec-it[containerId]bash检查,它将您带入容器,然后env
列出环境变量。。。如果未将DB\u HOST
正确设置为环境变量,则不会在application.properties文件中替换它。验证其设置后,变量应级联到应用程序中将整个项目复制到映像中,添加WORKDIR/usr/src/app
,然后您应能够添加标准RUN mvn clean package
。除非pom.xml
中有错误,否则只要pom.xml在指定的目录中,该命令就应该运行。i、 e.不要只做复制src/usr/src/app/src
,而是做复制/usr/src/app
我刚刚检查了一下,发现DB_主机没有正确设置,这很奇怪,因为它是在我的docker组件中定义的。今晚我将尝试测试一下我的终端-应该不太难得到一个最低的工作版本
spring.datasource.url=jdbc:postgresql://db:5432/my_db
spring.datasource.username=postgres
spring.datasource.password=postgres
version: '3'
services:
db:
container_name: db
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: my_db
ports:
- "5432:5432"
volumes:
- db-data:/var/lib/postgresql/data
networks:
- db-network
restart: always
server:
build: './server'
depends_on:
- db
environment:
DB_HOST: db # untested, but there should be a way to pass this in
DB_PORT: 5432
DB_DATABASE: my_db
DB_USER: postgres
DB_PASSWORD: postgres
restart: always
ports:
- "9000:9000"
networks:
- db-network
volumes:
- ./server:/server
networks:
db-network:
volumes:
db-data:
spring.datasource.url=jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_DATABASE}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}