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

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主机名,步骤如下:

  1. 确保目标服务容器已启动:docker-compose up -d auth-gateway
  2. 进入容器执行迁移命令:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:50:04