【问题标题】: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 docsDocker 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"]
    

    【讨论】:

      猜你喜欢
      • 2021-02-19
      • 2015-03-02
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 2017-06-12
      • 2020-10-05
      • 2016-01-14
      相关资源
      最近更新 更多