postgresql - 有两个 docker-compose 文件时如何连接到 postgres 数据库?
问题描述
首先,我使用 Dockerfile 构建了一个映像:
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*-SNAPSHOT.jar
ADD ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
因为我有两个 docker-compose 文件,一个用于生产:
version: "3"
services:
app:
image: "demo:latest"
container_name: demo-production-api
restart: always
depends_on:
- "productiondb"
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://productiondb:5432/testdb
- SPRING_DATASOURCE_HIKARI_JDBC_URL=jdbc:postgresql://productiondb:5432/testdb
- SPRING_DATASOURCE_USER=tester
- SPRING_DATASOURCE_PASSWORD=test
- SPRING_JPA_HIBERNATE_DDL_AUTO=update
ports:
- "8440:8443"
productiondb:
image: "postgres:latest"
container_name: productiondb
ports:
- "5430:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
- postgres-db-production:/usr/local/var/postgres
volumes:
postgres-db-production:
一个用于开发:
version: "3"
services:
app:
image: "demo:latest"
container_name: demo-develop-api
restart: always
depends_on:
- "developdb"
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://developdb:5432/testdb
- SPRING_DATASOURCE_HIKARI_JDBC_URL=jdbc:postgresql://developdb:5432/testdb
- SPRING_DATASOURCE_USER=tester
- SPRING_DATASOURCE_PASSWORD=test
- SPRING_JPA_HIBERNATE_DDL_AUTO=update
ports:
- "8441:8443"
developdb:
image: "postgres:latest"
container_name: developdb
ports:
- "5431:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
- postgres-db-develop:/usr/local/var/postgres
volumes:
postgres-db-develop:
我使用以下方法构建两个图像:
docker-compose -p demo-production-api -f docker-compose.yml up -d && docker-compose -p demo-develop-api -f docker-compose-develop.yml up -d
现在我也能够构建两个环境 demo-develop-api 和 demo-production-api 了,来自 demo-develop-api docker 镜像的 Spring Boot 应用程序使用以下命令运行:
docker run -it demo-develop-api
应用程序运行,但我不断收到此错误:
引起:java.net.UnknownHostException:productiondb
将application.properties文件中的数据库主机从localhost更改为productiondb后发生上述错误,我得到以下信息:
org.postgresql.util.PSQLException:连接到 localhost:5432 被拒绝。检查主机名和端口是否正确以及 postmaster 是否接受 TCP/IP 连接。
为什么会出现这个问题或原因是什么?如何解决此类问题?
解决方案
所以经过长时间的调试和试验,希望这可以节省人们的时间,结果发现,实际上,容器内的 Spring Boot 应用程序正在重新启动运行并崩溃而没有任何错误,这让我更加困惑为什么它没有监听或打开端口。我什至怀疑它可能是防火墙或其他东西。所以基本上我只是尝试通过执行以下操作从容器中获取外壳:
docker exec -it <container id or image> sh
注意:由于我使用的是图像openjdk:8-jdk-alpine
,请不要在下面执行此操作,您将不会获得外壳:
docker exec -it <container id or image> bash
然后我尝试通过执行以下操作获取开放端口列表:
netstat -tulpn | grep ":8443"
该端口8443
未列出,我认为这可能是java程序未运行的问题,尝试执行已执行但没有任何错误的spring boot,并且shell本身正在退出,这让我更加困惑。直到我发现容器由于 Spring Boot 崩溃而重新启动。所以我通过添加以下属性来启用详细模式,application.properties
然后再次重建图像:
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=DEBUG
所以我重试了上面的最后一步,我得到了一个 shell 并执行app.jar
它,结果发现数据库testdb
不存在。
更新:所以在这里总结一下我是如何修改我的项目的,我为我的案例创建了两个 Spring Boot 配置文件,一个用于开发application-develop.properties
,一个用于生产application-production.properties
:
所以在里面application-develop.properties
我把它映射到一个开发 postgres 容器主机和端口:
spring.datasource.url=jdbc:postgresql://developdb:5432/testdb
spring.datasource.hikari.jdbc-url=jdbc:postgresql://developdb:5432/testdb
spring.datasource.username=tester
spring.jpa.generate-ddl=true
spring.datasource.password=test
spring.jpa.database-platform=postgres
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
server.port=8443
对于application-production.properties
:
spring.datasource.url=jdbc:postgresql://productiondb:5432/testdb
spring.datasource.hikari.jdbc-url=jdbc:postgresql://productiondb:5432/testdb
spring.datasource.username=tester
spring.jpa.generate-ddl=true
spring.datasource.password=test
spring.jpa.database-platform=postgres
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
server.port=8443
在开发的 docker-compose 文件中,我只是将 Spring Boot 配置文件环境变量定义为:
environment:
- SPRING_PROFILES_ACTIVE=develop
对于生产 docker-compose 文件,我将其定义如下:
environment:
- SPRING_PROFILES_ACTIVE=production
推荐阅读
- xamarin - 使用 Xamarin 表单进行剃须刀支付
- python-3.x - PYSPARK org.apache.spark.sql.AnalysisException:无法解析给定输入列的“INPUT__FILE__NAME”
- c - c中char指针的指针,赋值崩溃
- python - python re.sub 无法捕获长文本中的复杂字符串
- flutter - Flutter 如何在 PopupMenuButton 小部件中获取上下文?
- javascript - React 无缝扩展产品卡片到全屏
- spring - Spring JPA - 实体之间是否有一种内部连接的好方法,或者唯一的方法是 JPQL?
- python - “工具提示”在 python 传单映射中不起作用
- flutter - Flutter - 不再出现在小部件树中的小部件或此错误可能表示内存泄漏警告
- json - 我不知道现在如何处理问题无效语法(
,第 20 行)pylint(语法错误)