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

