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:用环境变量区分运行环境,适配宿主和容器两种场景
- 项目根目录新建
.env文件,添加以下配置:
DB_HOST=localhost DB_PORT=5432 DB_USER=inesc DB_PASSWORD=inesc2021 DB_NAME=db_inesc
- 修改
docker-compose.yml的server服务配置,添加环境变量覆盖DB_HOST为容器内可解析的服务名:
services: server: # 原有其他配置保持不变 environment: - DB_HOST=postgres
- 删除原有的
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
相关产品推荐
相关产品推荐

