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
相关产品推荐
相关产品推荐

