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

Docker容器无法连接PostgreSQL,出现getaddrinfo EAI_AGAIN错误求助

问题分析与修复方案

这个问题基本可以确定是docker-compose配置导致的,结合你遇到的两种DB_HOST设置都失败的情况,具体排查和修复方向如下:

1. 核心问题拆解

  • 设DB_HOST=postgres时出现getaddrinfo EAI_AGAIN postgres:本质是Docker容器间DNS解析失败——你的main服务和postgres服务不在同一个Docker网络里,导致main容器无法通过服务名定位到postgres容器。
  • 改localhost没用的原因:容器内部的localhost指向容器自身,而非宿主机或其他容器。除非postgres直接跑在宿主机且main容器用了host网络模式,否则localhost根本找不到postgres。

2. 具体修复步骤

(1)确保两个服务在同一网络

默认docker-compose会为项目创建默认网络,但如果手动配置了网络,必须让两个服务都加入:

version: '3.8'
services:
  main:
    build: .
    env_file: .env
    networks:
      - app-net
  postgres:
    image: postgres:15
    environment:
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ${DB_NAME}
    networks:
      - app-net
networks:
  app-net:
    driver: bridge

同一网络内的容器可以直接通过服务名(比如postgres)互相访问。

(2)控制服务启动顺序

就算网络没问题,如果main服务比postgres先启动,postgres还没就绪也会连接失败。给main服务加依赖和健康检查:

main:
  # 其他配置...
  depends_on:
    postgres:
      condition: service_healthy
postgres:
  # 其他配置...
  healthcheck:
    test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
    interval: 5s
    timeout: 5s
    retries: 5

这样main服务会等postgres完全启动就绪后再启动。

(3)验证环境变量传递

确认main服务正确加载了.env文件,或者直接在docker-compose里显式指定DB参数,避免环境变量未生效:

main:
  environment:
    DB_HOST: postgres
    DB_PORT: 5432
    DB_USER: ${DB_USER}
    DB_PASSWORD: ${DB_PASSWORD}
    DB_NAME: ${DB_NAME}

3. 快速验证方法

启动服务后,进入main容器执行以下命令:

docker exec -it <你的main容器名称> bash
# 尝试ping postgres服务
ping postgres

如果能ping通,说明网络没问题,再检查数据库的端口、用户名密码是否正确;如果ping不通,直接排查网络配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:52:35