Docker/Angular/Nginx: "exec: \"npm\": 在 $PATH 中找不到可执行文件"

11

我有一个Angular应用程序,我与Nginx一起使用Docker打包。我的Dockerfile如下:

FROM node:8.11.3 as node

WORKDIR /app

COPY package.json /app/

RUN npm install
COPY ./ /app/

ARG env=prod

RUN npm run build -- --prod --environment $env

FROM nginx:1.13

COPY --from=node /app/dist/ /usr/share/nginx/html

RUN rm /etc/nginx/conf.d/default.conf
COPY ./nginx-custom.conf /etc/nginx/conf.d/default.conf

EXPOSE 4200
CMD ["npm", "start"]

我建立了我的 Docker 镜像,但是当我开始执行 docker run 命令时,我收到以下错误消息:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"npm\": executable file not found in $PATH": unknown.
如果我从Dockerfile中删除最后一个命令(CMD ["npm","start"]),我可以运行我的docker镜像 - 它可以工作。但我猜我需要最后一个命令,这样我就可以在AWS上部署和运行我的应用程序。同时 'CMD npm start' 不起作用。我看过一些类似问题的帖子,但是没有解决方案对我有用。
更新:
我删除了最后一行 - CMD npm start。ECS现在正在尝试启动我的任务 - 但它以退出代码1停止,并没有进一步的评论。有任何想法吗?
谢谢, Michael

在运行Angular应用程序时,不应使用npm start命令。该命令是用于创建开发过程中使用的开发服务器。请参阅https://angular.io/guide/deployment。此外,如果您想在AWS上运行它,将其作为静态内容提供而不是Docker映像将更便宜。 - user184994
什么是正确的启动方式?如果我使用CMD["ng", "serve", "-H", "0.0.0.0"],我会得到相同的错误信息。 - Michael H.
嗨,你的意思是我在AWS上根本不应该使用Docker吗? - Michael H.
据我所理解,第二个FROM指令会覆盖第一个,因此在运行CMD时可能没有可用的npm可执行文件。请参考此链接: https://dev59.com/oFwX5IYBdhLWcg3w2SZq - Sergii Vorobei
但是,如果您使用nginx来提供服务,则没有必要使用npm start,也没有必要访问端口4200,因为nginx可能正在侦听80,并且端口4200代表开发服务器。 - user184994
显示剩余6条评论
1个回答

4

nginx Docker 镜像不包含 npm。您需要使用包含 npmnode:latestnode:alpine


Docker文件包含多个FROM子句(一个是node,另一个是nginx)- 可能没有正确处理该部分。 - Petr Gladkikh
为什么他想要切换到没有nginx的图像呢?这毫无意义,这个答案毫无意义。他正在询问如何在nginx容器上使npm和yarn工作。如果它们不存在,则可能需要安装npm和yarn两者。 - PositiveGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接