NestJS微服务混合架构中PostgreSQL TypeORM迁移执行失败求助
NestJS微服务架构中TypeORM迁移报错
getaddrinfo ENOTFOUND postgres解决办法 在NestJS混合应用微服务架构中执行PostgreSQL TypeORM迁移时,运行yarn migration:run命令后出现如下错误,已卡在此问题超过24小时,不想在TypeORM连接中使用synchronize:true,寻求解决办法,如需更多文件可提供。
错误日志
yarn migration:run > core-connect-lite@0.0.1 typeorm > ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli migration:run -d ./typeOrm.config.ts Error during migration run: Error: getaddrinfo ENOTFOUND postgres at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:120:26) { errno: -3008, code: 'ENOTFOUND', syscall: 'getaddrinfo', hostname: 'postgres' }
Docker Compose配置
services: wemacc: build: context: '.' dockerfile: ./apps/auth-gateway/Dockerfile target: development command: npm run start:dev wemacc ports: - '3000:3000' env_file: - ./apps/wemacc/.env depends_on: - postgres - rabbitmq - auth-gateway volumes: - .:/usr/src/app - /usr/src/app/node_modules auth-gateway: build: context: '.' dockerfile: ./apps/auth-gateway/Dockerfile target: development command: npm run start:dev auth-gateway ports: - '3001:3001' env_file: - ./apps/auth-gateway/.env depends_on: - postgres - rabbitmq volumes: - .:/usr/src/app - /usr/src/app/node_modules postgres: image: postgres:12 container_name: postgres ports: - 5432:5432 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=root - POSTGRES_DB=core_connect - POSTGRES_HOST=postgres - POSTGRES_PORT=5432 volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped pgadmin: container_name: pgadmin image: dpage/pgadmin4 restart: always environment: PGADMIN_DEFAULT_EMAIL: admin@pgadmin.com PGADMIN_DEFAULT_PASSWORD: admin ports: - '5050:80' depends_on: - postgres rabbitmq: image: rabbitmq ports: - '5672:5672' volumes: postgres_data: {}
问题原因
报错本质是本地执行迁移命令时,无法解析Docker Compose内部网络的postgres主机名。postgres是Docker容器服务名,仅在Docker内部网络中可被识别,本地机器的DNS系统找不到这个主机名,导致连接失败。
解决办法
1. 临时修改本地数据库连接配置
修改typeOrm.config.ts或对应的.env文件,将数据库连接的host字段从postgres改为localhost:
- 示例
.env修改:DB_HOST=localhost - 示例TypeORM配置修改:
// typeOrm.config.ts export default { // ...其他配置 host: process.env.DB_HOST || 'localhost', // ...其他配置 };
修改后重新执行yarn migration:run即可,此方法适合本地开发临时使用。
2. 在Docker容器内部执行迁移
容器处于Docker内部网络,可正常解析postgres主机名,步骤如下:
- 确保目标服务容器已启动:
docker-compose up -d auth-gateway - 进入容器执行迁移命令:
docker exec -it auth-gateway yarn migration:run
若使用wemacc容器,替换容器名为wemacc即可。
3. 新增Docker Compose迁移服务(推荐,适合团队协作/CI/CD)
在docker-compose.yml中添加专门的迁移服务,确保迁移始终在Docker网络中执行:
services: # ...原有服务 migration: build: context: '.' dockerfile: ./apps/auth-gateway/Dockerfile target: development command: yarn migration:run env_file: - ./apps/auth-gateway/.env depends_on: - postgres volumes: - .:/usr/src/app - /usr/src/app/node_modules
添加后执行以下命令运行迁移:
docker-compose run migration
4. 本地hosts文件映射(不推荐)
在本地hosts文件中添加一行映射,让本地机器将postgres解析到本地IP:
127.0.0.1 postgres
此方法仅适合临时测试,换环境后需重新配置,灵活性差。
注意事项
- 确保postgres容器已正常启动:执行
docker-compose ps查看状态,若未启动则运行docker-compose up -d postgres - 验证数据库配置一致性:
.env文件中的DB_USER、DB_PASSWORD、DB_NAME需与Docker Compose中postgres服务的环境变量完全匹配
内容的提问来源于stack exchange,提问作者BoyePanthera
相关产品推荐
相关产品推荐

