NestJs应用连接PostgreSQL失败:getaddrinfo ENOTFOUND postgres
问题排查与解决方案
这个错误getaddrinfo ENOTFOUND postgres的核心是:你的NestJS应用无法解析到名为postgres的数据库服务,下面是具体排查和修复步骤:
1. 检查Docker网络归属
- 确保NestJS应用容器和PostgreSQL容器处于同一个Docker网络。如果使用
docker-compose,默认会自动创建专属网络,但如果是单独启动的应用容器,需要手动加入数据库所在网络。 - 若你在
docker-compose.yml中自定义了网络,需保证两个服务都配置在该网络下,示例:
version: '3.8' services: app: build: . networks: - app-network postgres: image: postgres:15 networks: - app-network networks: app-network: driver: bridge
2. 修正数据库连接主机参数
- 你的
.env文件中,数据库主机必须设为postgres(即docker-compose.yml里PostgreSQL服务的名称),绝对不能写localhost或127.0.0.1——容器内的localhost指向容器自身,而非宿主机或其他容器。 - 正确的
.env配置示例:
DB_HOST=postgres DB_PORT=5432 DB_USER=postgres DB_PASSWORD=your_db_password DB_NAME=your_db_name
3. 确保数据库就绪后再启动应用
- NestJS启动速度通常快于PostgreSQL,可能数据库还未初始化完成,应用就发起了连接请求。可以在
docker-compose.yml中添加健康检查和依赖配置:
services: app: build: . depends_on: postgres: condition: service_healthy postgres: image: postgres:15 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5
4. 验证环境变量是否正确加载
- 执行
docker exec <你的应用容器名称> printenv,检查输出中的DB_HOST是否为postgres。如果不是,说明.env文件未正确挂载到容器中。 - 在
docker-compose.yml的app服务中,需明确配置加载.env:
services: app: build: . env_file: - .env # 或者通过挂载方式同步文件 volumes: - ./.env:/app/.env
内容的提问来源于stack exchange,提问作者Laravel Liwevire Question
相关产品推荐
相关产品推荐

