使用Docker Compose部署Go应用时PostgreSQL连接失败求助
解决Docker Compose部署Go应用时PostgreSQL连接失败问题
核心问题分析
你遇到的两个错误分别指向不同的连接配置问题:
- 默认网络下的
dial tcp [::1]:5432: connection refused:应用在尝试连接容器自身的localhost,而非Compose网络中的db服务容器 - 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
相关产品推荐
相关产品推荐

