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

Docker Compose中Spring Boot应用无法连接PostgreSQL数据库

问题分析与解决方案

核心问题原因

你的问题源于两个关键配置错误:

  1. 数据库端口配置错误
    Docker容器间通信使用的是容器内部端口,而非映射到主机的端口。你的my-app环境变量中DB_PORT设为5434(这是主机映射的端口),但Postgres容器内部实际监听的是默认端口5432,导致应用无法通过容器网络连接到数据库。

  2. 数据库未就绪时应用提前启动
    depends_on仅保证db容器启动完成,但Postgres启动后还需要时间初始化数据库、执行create_script.sql脚本,此时数据库并未真正就绪,应用连接必然失败。


修正后的docker-compose配置

services:
  my-app:
    build: .
    ports:
      - "8080:8080"
    environment:
      DB_HOST: app-db
      DB_PORT: 5432  # 改为容器内部的Postgres默认端口
      DB_USER: myuser
      DB_PASSWORD: mypassword
      DB_NAME: mydb
    depends_on:
      db:
        condition: service_healthy  # 等待数据库健康检查通过再启动
    container_name: my-app
  db:
    image: postgres:13-alpine
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydb
    volumes:
      - production_data:/var/lib/postgresql/data
      - ./db/create_script.sql:/docker-entrypoint-initdb.d/create_script.sql
    ports:
      - "5434:5432"  # 主机映射端口保留,不影响容器间通信
    container_name: app-db
    healthcheck:  # 添加健康检查,确认Postgres就绪
      test: ["CMD-SHELL", "pg_isready -U myuser -d mydb"]
      interval: 5s
      timeout: 5s
      retries: 5
volumes:
  production_data:

Spring Boot应用补充配置

在application.properties中添加连接重试与初始化配置,进一步确保应用能等待数据库就绪:

# Database connection
spring.datasource.url=jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME}
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

# 连接池重试配置
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.validation-timeout=5000

# 初始化等待配置(Spring Boot 2.3+)
spring.sql.init.mode=always
spring.sql.init.platform=postgresql

关键说明

  • 容器间通信时,直接使用服务名(app-db)和容器内部端口(5432)即可,主机映射端口仅用于外部(主机)访问容器。
  • 健康检查+service_healthy条件,确保应用只有在Postgres完全初始化、可以接受连接后才启动。
  • 连接池重试配置让应用在数据库临时不可用时,自动重试连接,避免启动时的连接失败。

内容的提问来源于stack exchange,提问作者Darlyn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:50:04