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

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  

错误原因

  1. 端口映射错误:PostgreSQL默认监听容器内的5432端口,你将宿主机5444端口映射到容器的5444端口,容器内无服务监听该端口,导致应用连接失败。
  2. 容器启动顺序问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:56:27