在Docker容器内无法执行TypeORM迁移生成命令问题求助
问题原因
错误1:docker exec执行报错exec: "typeorm": executable file not found in $PATH
- docker exec参数顺序错误:
-it是docker exec的固有参数,必须放在容器ID之前,放在容器ID之后会被识别为待执行命令的参数,导致命令解析错误。 typeorm是你在package.json的scripts中定义的npm脚本别名,不是容器内全局安装的可执行文件,不能直接作为命令调用,必须通过npm run前缀执行。- 补充:你提供的docker-compose.yml存在严重的缩进错误,postgres、backend、frontend服务的配置字段缩进层级错误,且没有显式加入自定义的
portfolio网络,可能导致服务间网络不通。
错误2:本地直接运行typeorm报错getaddrinfo EAI_AGAIN postgres
postgres是Docker Compose内部的服务域名,仅能被同一Docker网络内的容器解析,你的本地主机不在该Docker网络中,无法解析该域名,因此数据库连接失败。
解决方案
1. 修正docker-compose.yml格式
首先修正yaml缩进,同时将所有服务显式加入自定义网络,避免网络异常:
version: "3.8" services: postgres: image: postgres:13-alpine # restart: always volumes: - ./docker/db/data:${PGDATA:-/var/lib/postgresql/data} environment: POSTGRES_USER: root POSTGRES_PASSWORD: root # POSTGRES_DB: db ports: - 5432:5432 networks: - portfolio backend: build: context: backend target: dev dockerfile: Dockerfile volumes: - ./backend/:/src command: npm run start:dev ports: - "5000:3000" depends_on: - postgres environment: NODE_ENV: development DEBUG: nodejs-docker-express:* DB_SCHEMA: postgres DB_USER: root DB_PASSWORD: root DB_HOST: postgres networks: - portfolio frontend: ports: - 3001:3000 build: context: frontend dockerfile: Dockerfile # volumes: # - ./frontend:/usr/src/app # - /usr/src/app/node_modules # - /usr/src/app/.next networks: - portfolio networks: portfolio: driver: bridge
修正后执行命令重启服务:
docker-compose up -d --force-recreate
2. 修正容器内执行typeorm的命令
使用如下正确格式执行命令:
sudo docker exec -it <backend_container_id> npm run typeorm -- migration:generate -n Entity
说明:--为npm参数分隔符,作用是将后续的参数全部传递给typeorm命令本身。
3. 本地执行typeorm的方案
修改本地数据库连接配置,将DB_HOST的值从postgres改为localhost,再执行命令即可。也可以临时指定环境变量运行:
DB_HOST=localhost npm run typeorm -- migration:generate -n Entity
内容的提问来源于stack exchange,提问作者howard wolowitz
相关产品推荐
相关产品推荐

