Spring Boot应用连接Docker中PostgreSQL被拒绝,求错误排查
问题排查与解决
核心错误原因及修复方案
1. 数据库端口配置错误
容器间通信时,应使用PostgreSQL容器内部端口5432,而非映射到主机的5433端口。docker-compose中服务间通过服务名(postgres)直接访问时,端口需用容器自身的端口,5433:5432仅用于主机外部访问容器内的数据库。
修改app的数据源URL:
SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/animals
2. 数据库密码不匹配
Spring Boot应用配置的密码是s,但PostgreSQL容器设置的密码是darsmeved,两者不一致会导致后续认证失败(需先解决连接拒绝问题,再修正此配置)。
修改app的密码配置:
SPRING_DATASOURCE_PASSWORD=darsmeved
3. 容器启动顺序的潜在问题
depends_on: - postgres仅保证postgres容器先启动,但不确保PostgreSQL服务已完全就绪。可给postgres服务添加健康检查,确保数据库服务可用后再启动app:
更新postgres服务配置:
postgres: image: postgres:latest container_name: postgres environment: POSTGRES_DB: animals POSTGRES_USER: postgres POSTGRES_PASSWORD: darsmeved ports: - '5433:5432' restart: always healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d animals"] interval: 5s timeout: 5s retries: 5
同时给app服务添加健康检查依赖:
app: # 其他配置不变 depends_on: postgres: condition: service_healthy
修复后的完整docker-compose.yml示例
version: '2' services: app: image: 'docker-spring-boot-postgres:latest' build: context: . container_name: app depends_on: postgres: condition: service_healthy environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/animals - SPRING_DATASOURCE_USERNAME=postgres - SPRING_DATASOURCE_PASSWORD=darsmeved - SPRING_JPA_HIBERNATE_DDL_AUTO=update postgres: image: postgres:latest container_name: postgres environment: POSTGRES_DB: animals POSTGRES_USER: postgres POSTGRES_PASSWORD: darsmeved ports: - '5433:5432' restart: always healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d animals"] interval: 5s timeout: 5s retries: 5
内容的提问来源于stack exchange,提问作者gfd fds
相关产品推荐
相关产品推荐

