Docker化NestJS项目报错:无法找到@nestjs/cli模块文件
NestJS Docker化时找不到@nestjs/cli模块的解决办法
问题说明
尝试将NestJS应用Docker化时,遇到模块找不到错误:Error: Cannot find module '/usr/node_modules/@nestjs/cli/bin/nest.js'。已在本地和容器内执行yarn global add @nestjs/cli,但问题依旧。
现有配置文件
Dockerfile代码
# pull official base image FROM node:19.8.1-alpine as development WORKDIR /usr/src/app COPY package*.json ./ RUN yarn global add @nestjs/cli RUN yarn install --only=development COPY . . RUN yarn build FROM node:12.19.0-alpine3.9 as production ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} WORKDIR /usr/src/app COPY package*.json ./ RUN npm install --only=production COPY . . COPY --from=development /usr/src/app/dist ./dist CMD ["node", "dist/main"]
docker-compose.yml代码
version: '3.8' services: dev: container_name: nestjs_api_dev image: nestjs-api-dev:1.0.0 build: context: . target: development dockerfile: ./Dockerfile command: yarn start ports: - 3000:3000 - 9229:9229 networks: - nesjs-network volumes: - /usr/src/app/node_modules restart: unless-stopped
执行docker-compose up dev时的报错
0.776 $ nest build 0.834 node:internal/modules/cjs/loader:1093 0.834 throw err; 0.834 ^ 0.834 0.834 Error: Cannot find module '/usr/node_modules/@nestjs/cli/bin/nest.js' 0.834 at Module._resolveFilename (node:internal/modules/cjs/loader:1090:15) 0.834 at Module._load (node:internal/modules/cjs/loader:934:27) 0.834 at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12) 0.834 at node:internal/main/run_main_module:23:47 { 0.834 code: 'MODULE_NOT_FOUND', 0.834 requireStack: [] 0.834 } 0.834 0.834 Node.js v19.8.1 0.854 error Command failed with exit code 1. 0.854 info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
解决办法
问题核心是全局安装的@nestjs/cli未被容器的环境变量识别,或者全局安装方式在容器内存在路径兼容问题,以下是两种可行方案:
方案1:将@nestjs/cli作为项目开发依赖安装(推荐)
- 本地执行
yarn add --dev @nestjs/cli,更新项目的package.json - 删除Dockerfile中
RUN yarn global add @nestjs/cli这一行,开发依赖会通过yarn install --only=development自动安装 - 确保
package.json的scripts命令使用本地cli,示例:
Yarn会自动识别本地安装的cli,无需依赖全局路径。"scripts": { "start": "nest start", "start:dev": "nest start --watch", "build": "nest build" }
方案2:配置全局cli的环境变量
如果坚持全局安装,需要在Dockerfile中把yarn全局模块的bin目录加入PATH:
在RUN yarn global add @nestjs/cli之后添加:
# 先确认全局bin路径,Alpine系统通常为该路径,可通过yarn global bin命令验证 ENV PATH="${PATH}:/usr/local/share/.config/yarn/global/node_modules/.bin"
额外优化:开发环境热重载配置
当前docker-compose仅挂载了node_modules,无法实时同步本地代码修改,建议修改volumes部分:
volumes: - .:/usr/src/app - /usr/src/app/node_modules
同时将command改为开发模式命令,支持热重载:
command: yarn start:dev
内容的提问来源于stack exchange,提问作者Benjoe Carandang
相关产品推荐
相关产品推荐

