Docker Compose部署Spring Boot与PostgreSQL连接失败求助
解决Docker Compose中Spring Boot连接PostgreSQL被拒绝的问题
问题场景
本地STS运行Spring Boot应用时连接PostgreSQL正常,但执行docker-compose up启动容器后,Spring Boot应用抛出连接拒绝错误:
org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
错误原因
- 容器网络地址错误:容器内的
localhost指向容器自身,而非宿主机或PostgreSQL容器;同时docker-compose.yml中数据源URL写错为local,未使用Docker Compose服务名称作为主机名。 - 数据库未就绪就启动应用:
depends_on仅保证容器启动顺序,不确保PostgreSQL服务已完全就绪可接受连接。 - 配置文件语法错误:
application.properties中JPA方言配置多了一个多余的点,可能导致JPA运行异常。
解决步骤
1. 修正数据库连接地址
- 修改
docker-compose.yml中springapp服务的环境变量,将数据库主机名改为PostgreSQL服务的名称db(Docker Compose会自动为服务创建DNS解析):springapp: environment: SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/userdb - 优化
application.properties中的数据源URL,支持本地和容器环境兼容:spring.datasource.url=${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/userdb}
2. 修复JPA配置语法错误
将application.properties中的错误配置:
spring.jpa.properties..hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
改为:
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
3. 确保数据库就绪后启动Spring Boot
通过Docker Compose健康检查机制,等待PostgreSQL服务完全就绪后再启动Spring Boot应用:
- 在
docker-compose.yml的db服务中添加健康检查:db: # 原有配置不变 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d userdb"] interval: 5s timeout: 5s retries: 5 - 修改
springapp服务的depends_on配置,依赖db服务的健康状态:springapp: # 原有配置不变 depends_on: db: condition: service_healthy
4. 重新构建并验证
执行以下命令清理旧容器并重新启动:
docker-compose down -v docker-compose up --build
查看Spring Boot容器日志,确认连接数据库成功。
内容的提问来源于stack exchange,提问作者guidop21
相关产品推荐
相关产品推荐

