在构建过程中,docker 是根据什么来决定是创建新层还是使用现有层?

During build, on what basis does docker decide whether to create a new layer or use an existing layer?

docker 文件有各种命令,如 FROM、运行 等。每个命令都会创建一个层(中间图像)。

在构建过程中,假设图层已经存在,docker根据什么决定是创建新图层还是使用现有图层?

docker build 缓存系统非常简单。对于大多数命令,如果前一层被缓存,并且有一个层运行完全相同的命令(RUNENVCMD、...),那么它会重用缓存的层,并为下一个命令重复此检查。对于 COPYADD 命令,决定基于文件内容的散列。

这在 Docker 文档的 Best practices for writing Dockerfiles 中有详细说明。

实际上,这意味着以下几点:

  • 您几乎不需要 docker build --no-cache,因为如果 Docker 文件或任何涉及的文件发生更改,缓存将自动失效。
  • 如果安装依赖项的步骤很昂贵(npm installpip installbundle install、...),那么第一步只需 COPY列出依赖项的文件,然后是 RUN whatever install,然后是 COPY 应用程序的其余部分。如果仅更改了应用程序代码,这可以避免使 "install" 步骤的缓存无效。
  • 如果您有基于 Debian 或 Ubuntu 的映像,则 RUN apt-get update && apt-get install 在单个命令中。这避免了 "update" 步骤中的 URL 被缓存,但 "install" 步骤中的包发生变化,缓存的 URL 不再有效的问题。