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

c0vxltue  于 2022-11-22  发布在  Docker
关注(0)|答案(4)|浏览(919)

我试图在开发模式下运行一个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
hkmswyz6

hkmswyz61#

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

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

第一个阶段没有任何效果(你可以将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:
  • 将Nginx配置中后端服务器的主机名从localhost更改为另一个容器的Docker Compose名称。
sy5wg1nm

sy5wg1nm2#

似乎无法从容器访问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。

owfi6suc

owfi6suc3#

您可以执行以下操作

### 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;"]
jmp7cifd

jmp7cifd4#

如果您安装了Portainer.io来管理Docker设置,则可以从浏览器打开特定容器的控制台。
如果要运行引用命令(如“npm list”)以显示已加载的依赖项版本,这将非常有用。

这样你就可以这样看待它:

我发现这对于诊断依赖项更新破坏了某些东西的问题很有用,这在测试环境中工作得很好,但是Docker版本安装了较新的次要版本,破坏了应用程序。

相关问题