You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

错误原因

  1. 容器网络地址错误:容器内的localhost指向容器自身,而非宿主机或PostgreSQL容器;同时docker-compose.yml中数据源URL写错为local,未使用Docker Compose服务名称作为主机名。
  2. 数据库未就绪就启动应用:depends_on仅保证容器启动顺序,不确保PostgreSQL服务已完全就绪可接受连接。
  3. 配置文件语法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:10:37