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

Docker容器内Spring应用连接宿主机PostgreSQL报错排查

问题核心原因

报错显示连接localhost:5432,本质是你在docker-compose中配置的DATABASE_HOST等自定义环境变量,没有被Spring Boot正确加载到数据源配置中,应用最终读取的是application.properties里硬编码的jdbc:postgresql://localhost:5432/db_name地址,尝试连接容器内部的5432端口,自然会被拒绝。

Spring Boot的配置绑定有明确规则:

  1. 如果你在配置文件里把数据库地址、账号密码写死,没有留环境变量占位符,自定义命名的环境变量不会自动替换配置文件里的硬编码值
  2. 只有和配置项匹配的环境变量,才会直接覆盖配置文件内容,比如spring.datasource.url对应的可识别环境变量为全大写下划线格式的SPRING_DATASOURCE_URL,你自定义的DATABASE_HOST不在默认绑定规则里,不会生效。
修复方案

二选一即可:

  • 方案1:修改application.properties,增加环境变量占位符,让配置可以读取你传入的自定义环境变量
    把原有数据源配置替换为以下内容:
    spring.datasource.driver-class-name=org.postgresql.Driver
    spring.datasource.url=jdbc:postgresql://${DATABASE_HOST:localhost}:${DATABASE_PORT:5432}/${DATABASE_NAME:db_name}
    spring.datasource.username=${DATABASE_USER:user}
    spring.datasource.password=${DATABASE_PASSWORD:****}
    
    配置中${变量名:默认值}的逻辑是优先读取环境变量值,环境变量不存在时使用冒号后的默认值,本地开发、容器部署场景可以通用。
  • 方案2:不修改配置文件,直接在docker-compose中传入Spring Boot可直接识别的数据源环境变量,覆盖配置文件的硬编码值
    把docker-compose中environment段的配置调整为:
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://192.168.65.2:5432/db_name
      - SPRING_DATASOURCE_USERNAME=user
      - SPRING_DATASOURCE_PASSWORD=****
    
    Spring Boot配置优先级规则中,容器传入的环境变量优先级高于jar包内的application.properties配置,会直接覆盖硬编码值。
优化建议

你目前硬编码的宿主机IP192.168.65.2是Docker Desktop在部分系统下分配的宿主机地址,兼容性较差,可以替换为Docker官方提供的专用DNS名host.docker.internal,这个域名在容器内会自动解析为宿主机的真实IP,支持Windows、macOS以及新版Linux环境的Docker,不需要手动查宿主机IP。

你之前已经验证过容器内可以telnet通宿主机5432端口,PostgreSQL的listen_addresses、pg_hba.conf放通配置也已经正确,修复配置绑定问题后即可正常连接,不需要额外调整数据库配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:36:10