如何用docker-compose实现Postgres与Node.js连接?遇ECONNREFUSED错误
解决API无法连接PostgreSQL的ECONNREFUSED问题
1. 验证PostgreSQL服务状态
- 执行
docker-compose ps查看postgres容器运行状态,确认状态为Up。若容器处于Exit或Restarting状态,通过docker-compose logs postgres查看初始化日志,排查权限错误、挂载卷异常等启动问题。 - 进入postgres容器测试服务可用性:
docker-compose exec postgres psql -U <你的数据库用户名> -d <你的数据库名>,能成功进入则说明容器内PostgreSQL服务正常。
2. 修正API连接配置
- 把API连接字符串中的静态IP(比如
172.24.0.3)替换为docker-compose中postgres服务的服务名(通常是postgres),Docker Compose默认网络支持服务名解析,IP地址会随容器重启动态变化。 - 核对连接配置的端口是否为
5432(PostgreSQL默认内部端口),注意区分docker-compose.yml中ports字段的宿主机端口和容器内部端口,API连接应使用容器内部端口。 - 确保API配置的用户名、密码、数据库名,与postgres服务的环境变量(
POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB)完全一致。
3. 检查Docker网络连通性
- 确认API服务与postgres服务处于同一Docker网络,默认情况下docker-compose会自动创建专属网络,所有服务默认加入该网络。若手动指定网络,需确保两个服务都配置了相同的
networks字段。 - 执行
docker network inspect <你的compose网络名>(网络名一般为项目名_default),查看两个容器是否在同一网络列表中。
4. 确保PostgreSQL初始化完成后启动API
- PostgreSQL首次启动或重启时需要时间完成初始化,若API启动速度过快会导致连接失败。在docker-compose.yml中为API服务添加依赖与健康检查配置:
配置后API会等待PostgreSQL完全就绪后再启动。services: api: # 其他配置项 depends_on: postgres: condition: service_healthy postgres: # 其他配置项 healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 5s timeout: 5s retries: 5
5. 排查网络限制
- 确认宿主机防火墙未阻止Docker容器间的内部网络通信,Docker默认会配置内部网络规则,若使用自定义网络需确认无额外限制。
内容的提问来源于stack exchange,提问作者Sandeep M
相关产品推荐
相关产品推荐

