首页 > 解决方案 > 如果我更改了复制文件的方式,为什么我的 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 .使用缓存?

标签: linuxdockerdockerfile

解决方案


docker 文件中的每一行都会生成一个新的“层”。Docker 将保留所有这些层。如果您的目录中没有任何更改,则不需要运行COPY . .,因为它保存了上次运行时的图层。

RUN npm install需要一段时间,但如果您的依赖项发生更改,它只会导致新状态。(您安装了一个新包,或更新了一个包)。

如果COPY . .需要重新运行(因为您更新了代码),那里的每一行也需要重新运行。因为您可能比依赖项更频繁地更改代码,所以提前安装依赖项是有意义的。

如果你曾经添加一个新的 npm 包,你会看到 Docker 会重新运行每一行RUN npm install


推荐阅读