Rat*_*het 22 node.js npm docker docker-compose angular
我正在尝试在 docker 容器内以开发模式运行角度应用程序,但是当我使用 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
Run Code Online (Sandbox Code Playgroud)
真正的问题是它无法识别命令 npmserve,但为什么?
设置如下:
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"]
Run Code Online (Sandbox Code Playgroud)
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/;
}
}
Run Code Online (Sandbox Code Playgroud)
Docker Compose 文件(我遇到问题的重要部分)
sypgod: # The name of the service
container_name: sypgod # Container name
build:
context: ../angular
dockerfile: Dockerfile # Location of our Dockerfile
Run Code Online (Sandbox Code Playgroud)
小智 9
看来无法从容器访问 npm。尝试定义它尝试从哪里执行:
docker run -v "$PWD":/usr/src/app -w /usr/src/app node:10.9 npm serve --port 4000
Run Code Online (Sandbox Code Playgroud)
来源:https ://gist.github.com/ArtemGordinsky/b79ea473e8bc6f67943b
还要确保运行 docker 容器的计算机上安装了 npm。
最终运行的图像是这样的:
FROM nginx:alpine
COPY toborFront.conf /etc/nginx/conf.d/
EXPOSE 8080
CMD ["npm", "serve", "--port 4000"]
Run Code Online (Sandbox Code Playgroud)
第一阶段没有任何效果(你可以COPY --from=...从中归档),如果有多个CMDs,则只有最后一个有效果。由于您在纯nginx图像中运行它,因此没有npm命令,导致您看到错误。
我建议在主机上使用 Node 作为实时开发环境。当您构建并测试了应用程序并希望部署它时,请在合适的情况下使用 Docker。在您的 Dockerfile 中,在第一阶段运行ng build以将应用程序编译为静态文件,COPY --from=...在第二阶段添加 a 以将构建的应用程序放入 Nginx 映像中,然后删除所有行CMD(nginx具有适当的默认值CMD)。@VikramJakhar 的答案有一个更完整的 Dockerfile 来显示这一点。
看起来您可能正在尝试在 Docker 中运行 Nginx 和 Angular 开发服务器。如果这是您的目标,您需要在两个单独的容器中运行它们。去做这个:
CMD ["npm", "serve"]行放在第一个(仅限 Angular)Dockerfile 的末尾。docker-compose.yml以运行第二个容器。后端npm serve容器不需要发布ports:.localhost其他容器的 Docker Compose 名称。