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

Docker容器中Express连接PostgreSQL失败问题求助

解决Docker化Express+PostgreSQL连接问题

核心问题分析

你遇到的两个错误对应两类核心问题:

  • ECONNREFUSED:目标端口无法建立连接,大概率是端口混淆或PostgreSQL未正确监听远程请求
  • getaddrinfo EAI_AGAIN:DNS解析失败,通常是网络隔离或数据库服务未正常运行

以下是分步骤的排查和解决方法:

1. 纠正端口混淆(最常见原因)

本地运行时你连接的是宿主机暴露的5400端口,但Docker容器间通信必须使用PostgreSQL容器的内部端口(默认是5432,除非你修改了容器内的PostgreSQL配置):

  • 若Compose中配置了5400:5432,说明宿主机5400端口转发到容器内5432端口,Express容器连接时要指定DB_PORT=5432,而非5400
  • 验证容器内PostgreSQL的实际监听端口:进入数据库容器执行psql -U <你的数据库用户> -c "SHOW port;",确认端口配置

2. 确保PostgreSQL允许远程连接

PostgreSQL默认仅监听localhost,需修改配置允许同一Docker网络的容器访问:

  • 进入PostgreSQL容器,编辑/var/lib/postgresql/data/postgresql.conf,设置listen_addresses = '*'
  • 修改pg_hba.conf,添加一行host all all 0.0.0.0/0 scram-sha-256(或匹配你的认证方式),允许所有IP段连接
  • 重启PostgreSQL容器使配置生效

3. 完善Docker Compose配置(解决依赖与网络问题)

添加健康检查确保PostgreSQL就绪后再启动Express,同时明确环境变量:

services:
  db:
    image: postgres:latest
    container_name: tododataBase
    ports:
      - "5400:5432" # 宿主机端口→容器内端口
    environment:
      POSTGRES_USER: your_db_user
      POSTGRES_PASSWORD: your_db_pass
      POSTGRES_DB: your_db_name
    volumes:
      - postgres_data:/var/lib/postgresql/data # 持久化数据库数据
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U your_db_user -d your_db_name"]
      interval: 5s
      timeout: 5s
      retries: 5

  api:
    build: ./your_api_directory # 替换为你的Express项目目录
    ports:
      - "3000:3000"
    environment:
      DB_HOST: tododataBase # 使用容器名作为连接Host
      DB_PORT: 5432 # 容器内的PostgreSQL端口
      DB_USER: your_db_user
      DB_PASSWORD: your_db_pass
      DB_NAME: your_db_name
    depends_on:
      db:
        condition: service_healthy # 等待数据库健康检查通过再启动

volumes:
  postgres_data:

4. 验证Express连接配置

确保你的Express代码使用正确的环境变量构建数据库连接:

const { Pool } = require('pg');

const pool = new Pool({
  user: process.env.DB_USER,
  host: process.env.DB_HOST,
  database: process.env.DB_NAME,
  password: process.env.DB_PASSWORD,
  port: parseInt(process.env.DB_PORT, 10),
});

5. 排查DNS解析问题

若仍出现getaddrinfo EAI_AGAIN:

  • 进入Express容器执行ping tododataBase,检查是否能解析到数据库容器的IP
  • 确认两个服务在同一Docker网络:Compose默认会创建专属网络,只要在同一compose文件内就会自动加入;若手动指定了网络,确保两个服务都引用同一网络
  • 检查PostgreSQL容器状态:执行docker ps确认容器处于Up (healthy)状态,若容器未启动或失败,查看日志排查(docker logs tododataBase)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:30:29