Docker容器中缺少`node_modules`

6
我正在使用以下 Dockerfile 为我的Node.js应用程序构建一个docker镜像:
FROM keymetrics/pm2:latest

RUN apk add --no-cache --update alpine-sdk python

# Bundle APP files
COPY package.json .

# Install app dependencies
ENV NPM_CONFIG_LOGLEVEL warn
RUN npm install
RUN npm rebuild bcrypt --build-from-source

COPY . .

# Show current folder structure in logs
RUN ls -al

EXPOSE 3000
VOLUME /app/uploads

CMD [ "pm2-docker", "start", "pm2.json" ]

问题在于从该镜像创建的Docker容器中不存在node_modules文件夹,因此应用程序会遇到错误并无法运行。
我在.dockerignore文件中有node_modules,但由于我在构建过程中安装了必要的软件包(RUN npm install),所以这不应该成为问题。

也许问题在于 COPY . . 会覆盖 npm install 已经安装的所有东西?尝试使用 COPY . . 替换 COPY package.json .,因为你的 package.json 也应该使用这个命令来复制。 - vfsoraki
@vfsoraki,不是这样的。我尝试将“COPY . .”部分注释掉,但“node_modules”仍然丢失。 - Kayvan Mazaheri
一次性运行 NPM,类似于 RUN npm install && npm rebuild bcrypt --build-from-source - user2915097
请查看此文档 https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/ - user2915097
@user2915097 也不行。 - Kayvan Mazaheri
@KayvanMazaheri,请问您找到解决方案了吗? - Suhas Chikkanna
3个回答

0
我曾经遇到过类似的问题,与无效的 package.json 文件有关,特别是 name 字段。在删除 name 字段中的空格后,它成功地创建了 node_modules。所以如果你遇到这样的错误,可能需要注意一下。 enter image description here

0
那么为什么不在构建时创建此目录(即在RUN npm install之前在您的Dockerfile中添加以下行)? RUN mkdir <workdir>/node_modules (将<workdir>替换为keymetrics/pm2镜像的实际默认工作目录)

0
我认为这是一个目录问题。 你需要设置


ENV ROOT /usr/src/app
WORKDIR ${ROOT}

之前

# Bundle APP files
COPY package.json .

例子:

FROM node:8

ENV ROOT /usr/src/app
WORKDIR ${ROOT}

COPY package*.json ./

RUN yarn -i --quiet

# Bundle app source
COPY . .

ENV NODE_ENV development

CMD yarn run start:dev

EXPOSE 3000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接