Docker Compose中Spring Boot应用无法连接PostgreSQL数据库
问题分析与解决方案
核心问题原因
你的问题源于两个关键配置错误:
数据库端口配置错误
Docker容器间通信使用的是容器内部端口,而非映射到主机的端口。你的my-app环境变量中DB_PORT设为5434(这是主机映射的端口),但Postgres容器内部实际监听的是默认端口5432,导致应用无法通过容器网络连接到数据库。数据库未就绪时应用提前启动
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
相关产品推荐
相关产品推荐

