Docker部署NestJs+PostgreSQL遇ECONNREFUSED连接错误求助
PostgreSQL连接ECONNREFUSED问题排查与解决
问题场景
使用NestJS+PostgreSQL+TypeORM开发Web应用,执行docker compose up后,日志显示数据库已就绪:
database system is ready to accept connections
但随即出现连接错误:
Error: connect ECONNREFUSED 172.29.0.2:5444
原docker-compose.yml配置如下:
version: '3.8' services: postgres: image: postgres ports: - "5444:5444" restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: asset_dis app: build: context: . dockerfile: Dockerfile depends_on: - postgres ports: - "3000:3000" environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: asset_dis DATABASE_URL: postgres://postgres:postgres@postgres:5444/asset_dis
错误原因
- 端口映射错误:PostgreSQL默认监听容器内的
5432端口,你将宿主机5444端口映射到容器的5444端口,容器内无服务监听该端口,导致应用连接失败。 - 容器启动顺序问题:
depends_on仅保证PostgreSQL容器先启动,不保证数据库服务完全就绪,可能应用启动时数据库还在初始化,引发连接超时。
修复步骤
1. 修正端口配置
修改postgres服务的端口映射,将宿主机5444映射到容器默认的5432端口;同时调整应用的DATABASE_URL,使用容器内的5432端口(Docker内部网络直接访问服务名postgres对应的容器端口)。
2. 添加数据库就绪检测
为postgres服务添加健康检查,确保应用仅在数据库完全就绪后启动。
修改后的完整配置
version: '3.8' services: postgres: image: postgres ports: - "5444:5432" # 宿主机5444映射到容器默认5432端口 restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: asset_dis healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d asset_dis"] interval: 5s timeout: 5s retries: 5 app: build: context: . dockerfile: Dockerfile depends_on: postgres: condition: service_healthy # 等待数据库健康检查通过 ports: - "3000:3000" environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: asset_dis DATABASE_URL: postgres://postgres:postgres@postgres:5432/asset_dis # 使用容器内5432端口
额外提示
- 本地宿主机连接数据库时,使用
localhost:5444即可,对应映射后的端口。 - 若仍有连接问题,可进入PostgreSQL容器执行
psql -U postgres -d asset_dis验证数据库是否正常运行。
内容的提问来源于stack exchange,提问作者Minh Trần
相关产品推荐
相关产品推荐

