Docker-Compose启动Node+Postgres应用报错ECONNREFUSED 127.0.0.1:5432求解决
解决Docker-compose启动Node+Postgres的连接拒绝问题
你的问题出在三个核心点上,对应修改方案如下:
1. 修正Node应用的数据库连接地址
错误提示里的127.0.0.1:5432说明你的Node代码硬写了本地回环地址,但在Docker容器环境中,127.0.0.1指向Node容器自身,而非Postgres容器。
你已经在api服务的环境变量里配置了DB_HOSTNAME: db,必须确保Node代码中的数据库连接配置使用这个环境变量,而非固定的127.0.0.1。示例代码如下:
// 正确使用环境变量的连接配置 const dbHost = process.env.DB_HOSTNAME || 'localhost'; const connectionString = `postgresql://${process.env.DB_USERNAME}:${process.env.DB_PASSWORD}@${dbHost}:5432/${process.env.DB_NAME}`;
2. 修正Postgres容器的端口与数据库初始化配置
Postgres镜像默认使用容器内的5432端口,你当前的db服务端口映射写的是"5430:5431",这会导致Postgres容器使用未配置的非默认端口,直接修改为:
services: db: image: postgres:10 ports: - "5430:5432" # 宿主机5430端口映射到容器内默认的5432端口 environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: TestDB6 # 启动时自动创建指定数据库,避免Node连接时数据库不存在
添加POSTGRES_DB: TestDB6环境变量,让Postgres启动时自动创建你需要的数据库,否则Node连接时会因数据库不存在报错。
3. 确保Postgres就绪后再启动Node服务
Postgres容器启动需要时间完成初始化,Node服务可能在数据库未就绪时就发起连接,导致连接拒绝。通过健康检查+依赖等待解决:
修改docker-compose.yml,给db服务添加健康检查,让api服务等待数据库就绪后再启动:
version: '2.2' services: db: image: postgres:10 ports: - "5430:5432" environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: TestDB6 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d TestDB6"] interval: 5s timeout: 5s retries: 5 api: build: . environment: DB_USERNAME: postgres DB_PASSWORD: postgres DB_NAME: TestDB6 DB_HOSTNAME: db ports: - 8081:8081 depends_on: db: condition: service_healthy
完成以上修改后,重新执行docker-compose up --build即可启动服务。
内容的提问来源于stack exchange,提问作者ajay bapat
相关产品推荐
相关产品推荐

