【问题标题】:Copying node_modules into a dockerfile vs installing them将 node_modules 复制到 dockerfile 与安装它们
【发布时间】:2022-01-20 21:26:31
【问题描述】:
我的任务是在工作中对我们的 Node 应用程序进行 docker 化。当谈到 node_modules 时,我与我们的首席开发人员有点意见分歧。
他在 dockerfile 中提倡类似的东西。他的理由是 docker 镜像将更具确定性,在这一点上我并不完全不同意他的观点。
COPY node_modules ./
我提倡这样的事情。我的推理.. 这基本上是互联网上每个人都说要做的事情,包括Node docs 和Docker docs。我希望我是从技术角度争论,但我似乎找不到任何专门解决这个问题的东西。
COPY package*.json ./
RUN npm install
那么谁是对的呢?与第一个选项相关的缺点是什么?
【问题讨论】:
标签:
node.js
docker
dockerfile
dependencies
node-modules
【解决方案1】:
我几乎总是从容器内部安装 Node 包,而不是从主机COPY 安装它们(如果我使用的是 npm,可能通过 RUN npm ci)。
如果主机环境与容器环境不完全匹配,COPYing 主机的node_modules 目录可能无法正常运行(或根本无法运行)。最明显的情况是使用带有 Linux 容器的 MacOS 或 Windows 主机,如果有任何 C 扩展或其他二进制文件,它们将无法工作。如果 Node 版本不完全匹配,也是可以想象的。最后,个别开发者可能已经npm installed 了一个额外的包或不同的版本,并且图像会因构建它的人而异。
还可以考虑使用多阶段构建来同时拥有node_modules 的开发和生产版本的方法;这样,您就不会在最终图像中包含诸如 tsc Typescript 编译器之类的仅构建工具。如果你有两个不同版本的node_modules,那么你不能COPY 来自主机的单个树,你必须将它安装在 Dockerfile 中。
FROM node AS build
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
RUN npm install
FROM node
WORKDIR /app
COPY package*.json .
ENV NODE_ENV=production
RUN npm ci
COPY --from=build /app/build /app/build
CMD ["node", "/app/build/index.js"]