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

Docker Compose中Node.js连接PostgreSQL报ECONNREFUSED错误求助

Docker Compose Node.js + PostgreSQL 连接拒绝错误修复

问题详情

启动应用时出现连接拒绝错误:

connect ECONNREFUSED 127.0.0.1:15432 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16) {
   errno: -111,
   code: 'ECONNREFUSED',
   syscall: 'connect',
   address: '127.0.0.1',
   port: 15432
 }

当前使用的配置文件:

docker-compose.yml

version: "3.8"

services:
  database:
    image: postgres:alpine
    container_name: postgres
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    ports:
      - 15432:5432
  
  node:
    container_name: node-ts
    depends_on:
      - database
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 3000:3000

Dockerfile

FROM node:18
WORKDIR /app
COPY ./ /app
RUN npm install
EXPOSE 3000
CMD npm start

已尝试但无效的配置:

links:
  - "database:postgres"
extra_hosts:
  - "host.docker.internal:172.0.0.1"
environment:
  DATABASE_URL: jdbc:postgresql://localhost:15432/postgres

修复方案

1. 修正数据库连接地址

容器内的localhost指向当前容器本身,而非宿主机或PostgreSQL容器。Docker Compose默认会为服务创建内部网络,同一网络下可通过服务名称直接访问其他容器:

  • 将连接地址中的localhost替换为PostgreSQL服务名database
  • 使用容器内部端口5432(而非宿主机映射的15432)

修改docker-compose.yml中node服务的环境变量:

node:
  # ... 其他配置
  environment:
    # 普通PostgreSQL客户端格式
    DATABASE_URL: postgresql://postgres:password@database:5432/postgres
    # JDBC格式(若使用JDBC客户端)
    # DATABASE_URL: jdbc:postgresql://database:5432/postgres?user=postgres&password=password

同时确保Node应用中读取该环境变量作为连接配置,而非硬编码localhost:15432。

2. 处理PostgreSQL启动延迟

depends_on仅保证容器启动顺序,不确保PostgreSQL服务已完全就绪(数据库初始化需要时间)。需添加等待逻辑:

方案A:代码层面添加重试

在Node应用的数据库连接逻辑中加入重试机制:

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

const dbConfig = {
  host: process.env.DATABASE_HOST || 'database',
  port: process.env.DATABASE_PORT || 5432,
  user: process.env.DATABASE_USER || 'postgres',
  password: process.env.DATABASE_PASSWORD || 'password',
  database: process.env.DATABASE_NAME || 'postgres'
};

const client = new Client(dbConfig);

async function connectDB() {
  try {
    await client.connect();
    console.log('数据库连接成功');
  } catch (err) {
    console.error('连接失败,2秒后重试...', err.message);
    setTimeout(connectDB, 2000);
  }
}

connectDB();

方案B:使用wait-for-it工具等待服务就绪

修改Dockerfile安装wait-for-it:

FROM node:18
WORKDIR /app
COPY ./ /app
RUN npm install && apt-get update && apt-get install -y wait-for-it
EXPOSE 3000
CMD ["wait-for-it", "database:5432", "--", "npm", "start"]

3. 移除无效配置

删除之前尝试的links、extra_hosts配置,Docker Compose默认网络已支持服务名解析,这些配置无必要且可能干扰连接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 06:30:33