Docker容器中npm run在GitLab CI与本地执行行为差异排查
问题原因与解决方案
核心原因
你遇到的sh: ember: not found错误,根源在于Docker镜像本身未包含ember命令,而Docker Compose的挂载操作掩盖了这个问题:
- Docker Compose的挂载逻辑:你通过
bind类型的卷将本地项目目录挂载到容器的/usr/app,此时容器内实际使用的是本地项目的文件和依赖(包括本地node_modules中的ember),因此npm run build能正常执行。 - GitLab CI的运行逻辑:直接使用构建好的镜像时,镜像内只有你Dockerfile中复制的
package*.json和安装的依赖。如果ember没有被声明为项目的dependencies或devDependencies,镜像安装依赖时就不会包含ember,自然找不到该命令。
解决方案
推荐采用本地依赖安装的方式,确保镜像内包含所需命令:
- 在本地项目中将ember-cli添加为开发依赖:
npm install --save-dev ember-cli - 更新项目的
package-lock.json,重新构建并推送Docker镜像。 - 此时GitLab CI使用新镜像执行
npm run build时,npm会自动从容器内/usr/app/node_modules/.bin目录中找到ember命令,正常执行构建。
如果必须使用全局安装,也可以在Dockerfile中添加全局安装步骤:
RUN npm install -g ember-cli
内容的提问来源于stack exchange,提问作者Raniere Silva
相关产品推荐
相关产品推荐

