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

Node服务通过Docker搭配TypeORM连Postgres生成迁移报ENOTFOUND错误求助

问题根因

这是Docker网络域名解析的典型场景:

  • Docker Compose为自定义网络servernet内的容器提供内部DNS解析,只有在该网络内运行的进程才能通过服务名postgres访问到数据库容器
  • 你直接在Mac本地终端执行yarn typeorm命令时,进程运行在宿主系统环境,不在servernet网络内,无法解析postgres主机名,所以抛出ENOTFOUND错误
  • 若把host改为localhost,宿主环境能通过映射的5432端口访问数据库,但Node服务运行在容器内部时,容器自身的localhost指向容器本身而非宿主,自然无法连接数据库

解决方案

推荐两种可落地的方案,可根据使用习惯选择:

方案1:在运行的Node容器内执行TypeORM命令

无需修改任何现有配置,启动容器后通过docker exec进入运行中的server容器执行迁移命令即可:

# 生成迁移
docker exec -it server yarn typeorm migration:generate -n UserRefac
# 执行迁移
docker exec -it server yarn typeorm migration:run

优势:完全兼容现有配置,所有操作和容器内运行环境一致,不会出现环境差异问题,适合刚接触相关技术栈的开发者使用。

方案2:用环境变量区分运行环境,适配宿主和容器两种场景

  1. 项目根目录新建.env文件,添加以下配置:
DB_HOST=localhost
DB_PORT=5432
DB_USER=inesc
DB_PASSWORD=inesc2021
DB_NAME=db_inesc
  1. 修改docker-compose.yml的server服务配置,添加环境变量覆盖DB_HOST为容器内可解析的服务名:
services:
  server:
    # 原有其他配置保持不变
    environment:
      - DB_HOST=postgres
  1. 删除原有的ormconfig.json,新增ormconfig.ts配置文件加载环境变量:
import dotenv from 'dotenv';
dotenv.config();

export default {
  type: "postgres",
  host: process.env.DB_HOST,
  port: parseInt(process.env.DB_PORT || '5432'),
  username: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  synchronize: false,
  logging: false,
  entities: ["src/classes/**/*.ts"],
  migrations: ["src/migrations/**/*.ts"],
  cli: {
    entitiesDir: "src/classes",
    migrationsDir: "src/migrations"
  }
}

优势:既可以直接在本地终端执行TypeORM命令,也能保证容器内服务正常连接数据库,灵活适配不同运行场景,适合项目后续迭代扩展。

内容的提问来源于stack exchange,提问作者Eduardo Campos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:57:05