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

使用Docker主机名仍无法连接localhost:5432问题求助

问题排查:Spring Boot容器连接PostgreSQL拒绝访问

核心问题分析

报错显示应用仍在尝试连接localhost:5432,说明配置的database服务名并未生效,同时存在多处配置不一致的问题:

1. 应用配置与环境变量不匹配,且未更新构建产物

  • application.properties硬编码了用户名postgres、密码postgres,但环境变量文件中是root/root,两者完全不匹配
  • 修改application.properties后未重新构建jar包,Docker使用的仍是旧的构建产物,新配置根本没生效

修改application.properties,改用环境变量统一配置(同时适配Spring Boot 2.7+的语法变更):

spring.datasource.url=jdbc:postgresql://database:5432/${POSTGRES_DB}
spring.datasource.username=${POSTGRES_USERNAME}
spring.datasource.password=${POSTGRES_PASSWORD}
# Spring Boot 2.7+已移除initialization-mode,替换为以下配置
spring.sql.init.mode=always

logging.level.org.springframework.security=DEBUG
logging.level.org.springframework.web=DEBUG

2. depends_on不保证数据库就绪

depends_on仅控制容器启动顺序,不会等待PostgreSQL完成初始化并就绪。Spring Boot启动时数据库还未准备好,直接触发连接拒绝。

修改docker-compose.yml,添加数据库健康检查、等待逻辑,并给backend服务传递环境变量:

services:
  backend:
    image: 'backend_festivalapp'
    container_name: 'backend_api'
    build: .
    ports:
      - '8080:8080'
    networks:
      - aad
    depends_on:
      database:
        condition: service_healthy  # 等待数据库健康检查通过
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USERNAME=${POSTGRES_USERNAME}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    # 额外添加启动延迟作为保险
    command: ["sh", "-c", "sleep 10 && java -jar /app.jar"]
    
  database:
    image: 'postgres:latest'
    container_name: 'postgres_database'
    restart: always
    ports:
      - '${POSTGRES_PORT}:5432'
    environment:
      - 'POSTGRES_DB=${POSTGRES_DB}'
      - 'POSTGRES_USER=${POSTGRES_USERNAME}'
      - 'POSTGRES_PASSWORD=${POSTGRES_PASSWORD}'
    expose:
      - 5432
    networks:
      - aad
    volumes:
      - 'backend_postgres:/var/lib/postgresql/data'
    # 添加PostgreSQL健康检查
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USERNAME} -d ${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 5

networks:
  aad:
volumes:
  backend_postgres:

3. 执行彻底重建流程

清理旧容器、重新构建jar包和镜像:

# 清理旧容器和数据卷
docker-compose down -v
# 重新构建Spring Boot应用(根据项目构建工具选择)
./gradlew clean build  # Gradle项目
# mvn clean package  # Maven项目
# 重新构建并启动容器
docker-compose up --build

验证步骤

  1. 查看数据库容器日志,确认出现database system is ready to accept connections
  2. 查看backend容器日志,确认连接URL为jdbc:postgresql://database:5432/aad_backend_festivalapp而非localhost

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:05:00