我试图在开发模式下运行一个Angular 应用程序在一个docker容器内,但当我运行它与docker-compose构建它的工作正常,但当我试图把容器,我得到以下错误:
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中运行)
我知道有更好的部署方法,但目前我需要此设置,因为一些个人原因
停靠文件:
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合成文件(我遇到问题的重要部分)
sypgod: # The name of the service
container_name: sypgod # Container name
build:
context: ../angular
dockerfile: Dockerfile # Location of our Dockerfile
4条答案
按热度按时间hkmswyz61#
最后运行的图像是这样的:
第一个阶段没有任何效果(你可以将
COPY --from=...
文件移出),如果有多个CMD
,只有最后一个有效果。因为你在一个普通的nginx
映像中运行这个,所以没有npm
命令,导致了你看到的错误。我建议在主机上使用Node作为实时开发环境。当您构建并测试了应用程序并打算部署它时,如果合适的话,可以使用Docker。在您的Docker文件中,在第一阶段运行
ng build
将应用程序编译为静态文件,在第二阶段添加COPY --from=...
将构建的应用程序编译为Nginx映像,并删除所有CMD
行(nginx
有一个适当的默认值CMD
)。看起来您可能尝试在Docker中同时运行Nginx和Angular开发服务器。如果这是您的目标,您需要在两个单独的容器中运行它们。为此:
CMD ["npm", "serve"]
行放在第一个(仅限Angular )停靠文件的末尾。docker-compose.yml
文件中添加第二个块来运行第二个容器。后端npm serve
容器不需要发布ports:
。localhost
更改为另一个容器的Docker Compose名称。sy5wg1nm2#
似乎无法从容器访问npm。请尝试定义它尝试执行的位置:
来源:https://gist.github.com/ArtemGordinsky/b79ea473e8bc6f67943b
还要确保运行Docker容器的计算机上安装了npm。
owfi6suc3#
您可以执行以下操作
jmp7cifd4#
如果您安装了Portainer.io来管理Docker设置,则可以从浏览器打开特定容器的控制台。
如果要运行引用命令(如“npm list”)以显示已加载的依赖项版本,这将非常有用。
这样你就可以这样看待它:
我发现这对于诊断依赖项更新破坏了某些东西的问题很有用,这在测试环境中工作得很好,但是Docker版本安装了较新的次要版本,破坏了应用程序。