【问题标题】:What is the optimal way to exploit Docker multi-stage builds?利用 Docker 多阶段构建的最佳方法是什么?
【发布时间】: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


【解决方案1】:

当我想构建镜像时,我总是在 docker 内部运行 npm install (ci),因为如果你将 node_modules 从开发环境复制到 docker 镜像,取决于你用于开发的操作系统,里面的许多二进制文件node_modules 是错误的( Windows/mac => Linux ),如果你使用 ubuntu 并且你的图像再次基于 Alpine,你会遇到一些问题。

最好的选择总是为 node_modules 构建一个层,然后,基于你的 node_module 层创建一个应用层 => 你将使用缓存和更快的构建。 注意:如果你想在 Windows 上复制 node_modules 使用 WSL2 (Ubuntu) 并基于 Ubuntu(Debian) 构建你的图像,那么你不用担心错误

【讨论】:

  • 我没有从我的本地机器上复制node_modules。我正在从构建阶段层复制它们。看看 Nodejs 文档中提到的这个例子:bitjudo.com/blog/2014/03/13/…
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 2022-11-25
相关资源
最近更新 更多