Docker Compose运行NestJS项目失败:提示‘nest command not found’
问题场景
我创建了一个NestJS项目,单独执行docker build和docker run命令能正常构建并运行,但用Docker Compose启动时,抛出nest command not found错误。
我的Docker Compose配置
version: '3' services: mastermine_api_gateway: build: dockerfile: nestsample/Dockerfile context: . volumes: - ./nestsample:/mastermine_api_gateway ports: - "3000:3000"
我的Dockerfile配置
FROM node:alpine3.18 WORKDIR /mastermine_api_gateway COPY nestsample/package*.json ./ RUN npm install COPY . . RUN npm install EXPOSE 3000 CMD [ "npm","run", "start:dev" ]
问题原因
核心问题出在Docker Compose的卷挂载逻辑上:你把本地的./nestsample目录直接挂载到容器内的/mastermine_api_gateway,这会完全覆盖容器里该目录下的所有内容——包括Dockerfile中通过npm install安装好的node_modules文件夹。
本地目录如果没在本地执行过npm install,或者没有全局安装nest-cli,容器运行npm run start:dev时,就找不到nest命令(因为启动脚本默认直接调用nest start --watch,优先查找全局命令,但容器内未全局安装,本地依赖又被覆盖了)。
解决办法
1. 保留热重载,同时保护容器内的node_modules
修改Docker Compose的volumes配置,添加匿名卷来排除node_modules的挂载:
volumes: - ./nestsample:/mastermine_api_gateway - /mastermine_api_gateway/node_modules
这样本地代码会同步到容器,但容器内安装好的node_modules会被保留,不会被本地目录覆盖,就能正常使用容器里的nest命令。
2. 修改启动脚本,用npx调用本地依赖
打开项目的package.json,把start:dev脚本改成用npx执行本地依赖中的nest命令:
"scripts": { "start:dev": "npx nest start --watch" }
npx会自动查找当前项目node_modules里的nest可执行文件,只要本地执行过npm install(或容器构建的依赖已同步到本地),就能正常运行。
3. 移除卷挂载(适合无需热重载的场景)
如果不需要本地代码修改实时同步到容器,可以直接删除Docker Compose里的volumes配置,容器会使用构建时的完整文件,不会出现依赖缺失问题。
内容的提问来源于stack exchange,提问作者Rajesh M P

