linux - 如果我更改了复制文件的方式,为什么我的 Docker 构建速度会加快?
问题描述
我有一个 docker 文件,如下所示:
.
.
WORKING /app
COPY ..
RUN npm install
.
.
它运行良好,但每次构建都需要大量时间(超过 7 分钟)。经过一番研究,我明白我必须优化 Dockerfile 以便它使用Cache。所以,我这样写:
.
.
WORKING /app
COPY package*.json .
RUN npm install
COPY ..
.
.
现在,它的构建速度要快得多(不到 1 分钟)。我的问题是“为什么”?
如果 Linux 在复制文件以覆盖它或从缓存中读取它时可以理解文件是否被修改,那么我预计两者都COPY ..
具有COPY package*.json .
相同的行为。为什么只COPY package*.json .
使用缓存?
解决方案
docker 文件中的每一行都会生成一个新的“层”。Docker 将保留所有这些层。如果您的目录中没有任何更改,则不需要运行COPY . .
,因为它保存了上次运行时的图层。
RUN npm install
需要一段时间,但如果您的依赖项发生更改,它只会导致新状态。(您安装了一个新包,或更新了一个包)。
如果COPY . .
需要重新运行(因为您更新了代码),那里的每一行也需要重新运行。因为您可能比依赖项更频繁地更改代码,所以提前安装依赖项是有意义的。
如果你曾经添加一个新的 npm 包,你会看到 Docker 会重新运行每一行RUN npm install
。
推荐阅读
- python - Cython - 动态 2D C++Array 的 Memoryview
- mongodb - MongoDB按偶数元素将数组拆分为N元素数组
- c# - 寻找着陆点
- json - Nil 与预期的参数类型“JSON”不兼容
- c# - 用于 IList 的 WPF 数据网格
- 无法添加新值 - authentication - 我重新启动节点红色,但用户仍然登录
- mysql - 当没有匹配的数据而不是返回 0 行时,有没有办法返回一个为零的列?
- redis - Redisson本地缓存使用
- solr - 为什么在所有阴影中都选择特定节点作为领导者
- node.js - 在猫鼬中创建数据时无法读取未定义的属性“推送”