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

使用Docker Compose部署Go应用时PostgreSQL连接失败求助

解决Docker Compose部署Go应用时PostgreSQL连接失败问题

核心问题分析

你遇到的两个错误分别指向不同的连接配置问题:

  1. 默认网络下的dial tcp [::1]:5432: connection refused:应用在尝试连接容器自身的localhost,而非Compose网络中的db服务容器
  2. Host网络下的pq: SSL is not enabled on the server:虽然你设置了sslmode=disable,但连接目标的变化导致DSN配置不匹配

分步解决方案

1. 修复默认网络下的连接拒绝问题

你的DB_DSN格式postgres://myuser:mypassword@db/mydbname?sslmode=disable本身是正确的(Compose同一网络内可通过服务名db直接访问数据库容器),错误的根源是应用没有正确加载到这个DSN:

  • 检查.env文件:确认DB_DSN的值确实是用db作为主机,而非localhost或127.0.0.1
  • 验证api容器的环境变量:执行docker exec backend-api printenv DB_DSN,查看实际生效的DSN是否正确。如果显示localhost,说明:
    • .env文件未被Compose正确加载(确认它和docker-compose.yml在同一目录)
    • Go代码未正确读取环境变量(比如忘记用dotenv加载本地.env,或者代码里硬编码了localhost)
  • 检查Go代码的连接逻辑:确保使用os.Getenv("DB_DSN")获取连接字符串,而非硬编码值

2. 修复Host网络下的SSL错误

当api服务使用network_mode: "host"时,容器共享宿主机网络,此时:

  • 无法再用服务名db访问数据库,必须改用localhost(因为宿主机的5432端口已映射到db容器)
  • 对应的DSN需要修改为:postgres://myuser:mypassword@localhost/mydbname?sslmode=disable
  • 同时注意:host网络模式下,Compose的内部DNS失效,所有服务间通信都要使用宿主机IP或localhost

3. 额外排查点

  • 确认db容器的健康状态:执行docker inspect backend-db | grep "Status",查看Health.Status是否为healthy,确保数据库完全就绪后api才启动
  • 检查PostgreSQL容器日志:执行docker logs backend-db,看是否有初始化失败或权限错误
  • 验证Compose配置解析:执行docker compose config,查看生成的配置中db服务的环境变量、网络是否正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 04:32:04