Spring Boot应用Docker容器无法连接PostgreSQL数据库问题求助
问题排查及解决方案
核心问题原因
- 1. PostgreSQL未自动创建目标数据库
你配置的数据库名是postgreTest,但db服务的环境变量中未指定POSTGRES_DB参数,PostgreSQL默认只会创建和POSTGRES_USER同名的数据库(也就是postgres),即使后续连接通了也会出现库不存在的报错。 - 2. 服务启动时序问题
docker-compose的depends_on仅控制容器启动顺序,不会等待PostgreSQL进程完全初始化、可以接受TCP连接后再启动Spring Boot应用。PostgreSQL初始化通常需要3~10秒,此时应用提前启动就会抛出连接拒绝异常,这是你当前报错的最直接原因。 - 3. 可选:网络端口校验(概率较低)
同个docker-compose下的服务默认加入同一网桥,容器间可直接通过服务名通信不需要暴露端口,如果你修改过docker的网络配置才需要额外排查。
修复方案
第一步:修改docker-compose.yml配置
version: '2' services: app: image: 'demo:latest' build: context: . container_name: app depends_on: db: condition: service_healthy environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/postgreTest - SPRING_DATASOURCE_USERNAME=postgres - SPRING_DATASOURCE_PASSWORD=B123456789 - SPRING_JPA_HIBERNATE_DDL_AUTO=update db: image: 'postgres:alpine' container_name: db environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=B123456789 - POSTGRES_DB=postgreTest healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5
第二步:重新部署
执行以下命令清除旧容器后重新启动:
docker compose down -v docker compose up --build
临时验证方法
如果不想修改配置,可以先单独启动数据库,等初始化完成后再启动应用验证问题:
# 只启动数据库 docker compose up -d db # 等待10秒后启动应用 sleep 10 docker compose up app
如果此时不再报错即可确认是启动时序导致的问题。
内容的提问来源于stack exchange,提问作者Snsn
相关产品推荐
相关产品推荐

