【发布时间】:2021-03-16 09:26:02
【问题描述】:
我在Dockerfile 中使用多阶段构建(第一阶段是 BUILD,第二阶段是 RUN)。
我想知道是否应该在第二阶段复制node_modules 文件夹,或者是否应该运行npm i。最佳方式是什么?
注意:我在第一阶段安装的所有apk包都需要正确运行npm ci(我有很多错误:node-gyp等)
# Build container stage
FROM node:alpine AS BUILD_IMAGE
RUN apk --no-cache add -u --virtual build-dependencies \
g++ gcc libgcc libstdc++ linux-headers make python3
WORKDIR /app
COPY package*.json ./
RUN npm ci && npm clean cache --force && apk del build-dependencies
COPY . .
RUN npm run lint
RUN npm run tsc
RUN npm prune --production
# Run container stage
FROM node:alpine AS app
WORKDIR /app
COPY /package*.json ./
# Should I copy the `node_modules` folder or
# should I run an `npm i` ? What is the optimal method?
COPY --from=BUILD_IMAGE /app/dist ./dist
COPY --from=BUILD_IMAGE /app/node_modules ./node_modules
# Clean dev packages
EXPOSE 8080
# Run the container with a non-root User
USER node
CMD [ "node", "dist/src/app.js" ]
【问题讨论】:
-
NodeJS 网站建议运行 npm install 而不是复制整个 node_modules 文件夹。来自文档:请注意,我们只复制 package.json 文件,而不是复制整个工作目录。这使我们能够利用缓存的 Docker 层。 bitJudo 对此有很好的解释。此外,在 cmets 中指定的 npm ci 命令有助于为生产环境提供更快、可靠、可重现的构建。您可以在此处阅读有关此内容的更多信息。 nodejs.org/en/docs/guides/nodejs-docker-webapp
-
@TommyBs:这篇文章 bitjudo.com/blog/2014/03/13/… 在 Node.js 文档中被提及,建议复制
node_modules。你怎么看?
标签: node.js docker npm dockerfile