从节点映像运行 docker 容器时找不到 Npm

Posted

技术标签:

【中文标题】从节点映像运行 docker 容器时找不到 Npm【英文标题】:Npm not found when running docker container from node image 【发布时间】:2018-02-04 09:07:37 【问题描述】:
# Dockerfile
FROM node:7-alpine
RUN mkdir -p /src/app
WORKDIR /src/app
COPY package.json /src/app/package.json
RUN npm install
COPY . /src/app
EXPOSE 3000
CMD ['npm', 'start']

我正在尝试使用上面的 Dockerfile 为 Dockerizing nodejs 应用程序完成 katacoda.com 练习。构建完成但运行映像立即退出,并且在我看到的 docker 日志中:

/bin/sh: [npm,: not found

我尝试使用 docker -it nodeapp /bin/bash 在交互模式下运行容器,这引发了错误 docker: Error response from daemon: oci runtime error: container_linux.go:262: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory". 所以我不确定这里发生了什么。

【问题讨论】:

尝试docker -it nodeapp sh 然后which npm 看看是否安装了npm 因为 alpine 没有 bash 因此出现上述错误。尝试使用sh 并在您进入后查看npm 感谢@TuanAnhTran docker -it nodeapp sh 工作,npm 已安装,npm start 工作 那么docker run .... 怎么没有呢? 我将其更改为CMD npm start,现在可以使用了。 【参考方案1】:

不起作用的原因是单引号

CMD ['npm', 'start']

应该是

CMD ["npm", "start"]

不使用双引号时,docker会去掉单引号,将命令处理为[npm, start]

这就是为什么您会看到错误 [npm, : not found

【讨论】:

【参考方案2】:

我有同样的症状,但问题略有不同。写在这里以防谷歌在我的情况下将其他人引导到此链接对我来说,问题是忘记CMD 中的逗号。所以解决方案是从CMD ["npm" "start"]CMD ["npm", "start"]

【讨论】:

我不敢相信自己犯了这个愚蠢的错误

以上是关于从节点映像运行 docker 容器时找不到 Npm的主要内容,如果未能解决你的问题,请参考以下文章

使用 Palantir Gradle 插件构建 Docker 容器时找不到 .jar 文件

Docker /bin/bash: nodemon: 找不到命令

通过桌面图标运行 bash 脚本时找不到节点命令

npm:在 Electron 应用程序中执行命令时找不到命令

通过“ npm install”安装时找不到Testcafe命令

在 Docker-Compose 上运行时找不到模块