我正在尝试对接与PostgresSQL DB连接的Sping Boot 应用程序。当我尝试使用Docker合成调出应用程序时,应用程序容器无法连接到PostgresSQL运行容器。我搜索了它,并尝试了大多数可能的修复(针对Docker合成文件中使用的DB依赖性),但仍然无法使其连接。
我可以从日志中看到-
错误原因:连接到postgresqldb:5432被拒绝。请检查主机名和端口是否正确,以及邮局管理员是否接受TCP/IP连接。springboot-postgresql|异常错误:连接被拒绝|在java.base/sun.nio.ch.Net.pollConnect(本地方法)上~[na:na]
我在本地的www.example.com文件里找到application.properties了-
spring.datasource.url= jdbc:postgresql://localhost:5432/ecommerce
spring.datasource.username= postgres
spring.datasource.password= root
spring.datasource.driver-class-name= org.postgresql.Driver
spring.sql.init.mode=always
#spring.batch.initialize-schema=always
logging.level.org.hibernate.SQL= DEBUG
spring.jpa.defer-datasource-initialization=true
spring.jpa.show-sql= true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.PostgreSQLDialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto= create
spring.jpa.hibernate.database= postgresql
enter code here
对接-合成-
version: '3.1'
services:
app:
container_name: springboot-postgresql
command: >
sh -c "/wait && java -jar /spring-boot-ecommerce.jar"
image: springboot-postgresql
extra_hosts:
- 'postgresqldb:127.0.0.1'
environment:
- RP_DB_HOST=postgres
- dbhost=localhost
- SPRING_DATASOURCE_URL=jdbc:postgresql://postgresqldb:5432/ecommerce?autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useSSL=false
build: ./
ports:
- '9090:8080'
depends_on:
- postgresqldb
postgresqldb:
container_name: postgresqldb
image: 'postgres:13.1-alpine'
ports:
- '5432:5432'
environment:
- POSTGRES_PASSWORD=root
- POSTGRES_USER=postgres
- POSTGRES_DB=ecommerce
volumes:
- './sql/data.sql:/docker-entrypoint-initdb.d/data.sql'
expose:
- 5432
restart: always
数据库容器已启动,具有相同的名称和端口,如下所示,但应用程序容器无法连接。一种可能性是应用程序容器比数据库启动早,我添加了相同的等待命令,但它没有创建差异。x1c 0d1x
[更新] -现在应用程序容器已启动并运行,我可以看到它已按预期更新了数据库。我无法使用http://localhost:9090/api/访问API。还尝试将localhost替换为容器inet addr。是否有任何指针?
1条答案
按热度按时间zlwx9yxi1#
TL;DR
去掉这个:
我看到您尝试将所有可能的修复应用到您的配置。让我们一步一步地详细说明。
EXPOSE
指令实际上并不发布端口。它只是对devs的一个提示。所以,你可以从你的compose中删除它,让配置更干净。container_name: postgresqldb
不用于解析Docker网络中的DNS名称。在您的情况下,由合成文件中的服务ID提供的域名(如postgresqldb
):阅读更多信息ports: '5432:5432'
不是从java应用程序访问数据库所必需的。这是使用iptables记录将主机tcp入口路由到容器所必需的。在您的情况下,此指令允许您在docker之外的主机上直接使用localhost:5432。例如,您可以在一些应该管理数据库的GUI中使用此地址。extra_hosts
指令将额外的DNS记录添加到一个容器中。在您的情况下,这是一个断点,因为它用错误的地址127.0.0.1
覆盖了postgresqldb
域。正如我在开始时提到的,只需删除此指令。如果您想知道postgresqldb
接收哪个IP,欢迎您检查Docker网络。阅读更多