我如何在Docker容器中运行npm命令?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何在Docker容器中运行npm命令?相关的知识,希望对你有一定的参考价值。
[我正在尝试在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
真正的问题是它无法识别npm服务,但是为什么呢?
设置将在下面:
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"]
NginxServerSite
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
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。
### STAGE 1: Build ###
# We label our stage as ‘builder’
FROM node:alpine as builder
RUN apk --no-cache --virtual build-dependencies add
git
python
make
g++
RUN mkdir -p /ng-app/dist
WORKDIR /ng-app
COPY package.json package-lock.json ./
## Storing node modules on a separate layer will prevent unnecessary npm installs at each build
RUN npm install
COPY . .
## Build the angular app in production mode and store the artifacts in dist folder
RUN npm run ng build -- --prod --output-path=dist
### STAGE 2: Setup ###
FROM nginx:1.14.1-alpine
## Copy our default nginx config
COPY toborFront.conf /etc/nginx/conf.d/
## Remove default nginx website
RUN rm -rf "/usr/share/nginx/html/*"
## From ‘builder’ stage copy over the artifacts in dist folder to default nginx public folder
COPY --from=builder /ng-app/dist /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
FROM nginx:alpine
COPY toborFront.conf /etc/nginx/conf.d/
EXPOSE 8080
CMD ["npm", "serve", "--port 4000"]
第一阶段没有任何作用(您可以从中删除COPY --from=...
个文件),并且如果有多个CMD
,则只有最后一个有作用。由于您是在普通的nginx
图像中运行此命令,因此没有npm
命令,导致出现错误。我建议将主机上的Node用于实时开发环境。当您构建并测试了应用程序并打算对其进行部署时,请在适当的情况下使用Docker。在您的Dockerfile中,在第一阶段运行
ng build
将应用程序编译为静态文件,在第二阶段运行COPY --from=...
以将已构建的应用程序放入Nginx映像,然后删除所有CMD
行([C0 ]具有适当的默认值nginx
)。 @VikramJakhar的CMD
有一个更完整的Dockerfile显示了这一点。看来您可能正在尝试在Docker中同时运行Nginx和Angular开发服务器。如果这是您的目标,则需要在两个单独的容器中运行它们。为此:
- 将此Dockerfile拆分为两个。将answer行放在第一个(仅角度)Dockerfile的末尾。
- 在
CMD ["npm", "serve"]
文件中添加第二个块以运行第二个容器。后端docker-compose.yml
容器不需要发布npm serve
。 - 将Nginx配置中的后端服务器的主机名从
ports:
更改为另一个容器的Docker Compose名称。
以上是关于我如何在Docker容器中运行npm命令?的主要内容,如果未能解决你的问题,请参考以下文章
Docker - 如何在postgres容器中运行psql命令?