如何在 docker 容器中运行 npm 命令?

新手上路,请多包涵

我正在尝试在 docker 容器内以开发模式运行 Angular 应用程序,但是当我使用 docker-compose build 运行它时,它可以正常工作,但是当我尝试放置容器时,出现以下错误:



ERROR: for sypgod  Cannot start service sypgod: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"npm\": executable file not found in $PATH

真正的问题是它无法识别命令 npm serve ,但是为什么呢?

设置如下:

Docker 容器(Nginx 反向代理 -> Angular 在端口 4000 中运行)

我知道有更好的方法来部署它,但由于某些个人原因,我现在需要这个设置

Dockerfile:


FROM node:10.9

COPY package.json package-lock.json ./

RUN npm ci && mkdir /angular && mv ./node_modules ./angular

WORKDIR /angular

RUN npm install -g @angular/cli

COPY . .

FROM nginx:alpine
COPY toborFront.conf /etc/nginx/conf.d/
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
CMD ["npm", "serve", "--port 4000"]

Nginx 服务器站点

server{
    listen 80;
    server_name sypgod;

    location / {
            proxy_read_timeout 5m;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://localhost:4000/;

    }

}

Docker Compose 文件(我遇到问题的重要部分)

  sypgod: # The name of the service
        container_name: sypgod  # Container name
        build:
            context: ../angular
            dockerfile: Dockerfile # Location of our Dockerfile

原文由 Ratchet 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

最终运行的图像是这样的:

 FROM nginx:alpine
COPY toborFront.conf /etc/nginx/conf.d/
EXPOSE 8080
CMD ["npm", "serve", "--port 4000"]

第一阶段没有任何效果(你可以 COPY --from=... 文件),如果有多个 CMD s,只有最后一个有效果。由于您在普通的 nginx 图像中运行它,因此没有 npm 命令,导致您看到的错误。

我建议在主机上使用 Node 作为实时开发环境。当您构建并测试了您的应用程序并希望部署它时,如果合适,请使用 Docker。在你的Dockerfile中,在第一阶段运行 ng build 将应用程序编译成静态文件,在第二阶段添加一个 COPY --from=... 将构建的应用程序放入Nginx镜像中,并删除所有 CMD 行( nginx 具有适当的默认值 CMD )。 @VikramJakhar 的 答案 有一个更完整的 Dockerfile 显示了这一点。

看起来您可能正在尝试在 Docker 中同时运行 Nginx 和 Angular 开发服务器。如果这是您的目标,您需要在两个单独的容器中运行它们。去做这个:

  • 将此 Dockerfile 一分为二。将 CMD ["npm", "serve"] 行放在第一个(仅限 Angular)Dockerfile 的末尾。
  • docker-compose.yml 文件中添加第二个块来运行第二个容器。后端 npm serve 容器不需要发布 ports:
  • 将 Nginx 配置中后端服务器的主机名从 localhost 更改为另一个容器的 Docker Compose 名称。

原文由 David Maze 发布,翻译遵循 CC BY-SA 4.0 许可协议

看起来无法从容器访问 npm。尝试定义它试图从哪里执行它:

 docker run -v "$PWD":/usr/src/app -w /usr/src/app node:10.9 npm serve --port 4000

来源: https ://gist.github.com/ArtemGordinsky/b79ea473e8bc6f67943b

还要确保在运行 docker 容器的计算机上安装了 npm。

原文由 btnhawk 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题