在构建过程中,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
缓存系统非常简单。对于大多数命令,如果前一层被缓存,并且有一个层运行完全相同的命令(RUN
、ENV
、CMD
、...),那么它会重用缓存的层,并为下一个命令重复此检查。对于 COPY
和 ADD
命令,决定基于文件内容的散列。
这在 Docker 文档的 Best practices for writing Dockerfiles 中有详细说明。
实际上,这意味着以下几点:
- 您几乎不需要
docker build --no-cache
,因为如果 Docker 文件或任何涉及的文件发生更改,缓存将自动失效。
- 如果安装依赖项的步骤很昂贵(
npm install
、pip install
、bundle install
、...),那么第一步只需 COPY
列出依赖项的文件,然后是 RUN whatever install
,然后是 COPY
应用程序的其余部分。如果仅更改了应用程序代码,这可以避免使 "install" 步骤的缓存无效。
- 如果您有基于 Debian 或 Ubuntu 的映像,则
RUN apt-get update && apt-get install
在单个命令中。这避免了 "update" 步骤中的 URL 被缓存,但 "install" 步骤中的包发生变化,缓存的 URL 不再有效的问题。
docker 文件有各种命令,如 FROM、运行 等。每个命令都会创建一个层(中间图像)。
在构建过程中,假设图层已经存在,docker根据什么决定是创建新图层还是使用现有图层?
docker build
缓存系统非常简单。对于大多数命令,如果前一层被缓存,并且有一个层运行完全相同的命令(RUN
、ENV
、CMD
、...),那么它会重用缓存的层,并为下一个命令重复此检查。对于 COPY
和 ADD
命令,决定基于文件内容的散列。
这在 Docker 文档的 Best practices for writing Dockerfiles 中有详细说明。
实际上,这意味着以下几点:
- 您几乎不需要
docker build --no-cache
,因为如果 Docker 文件或任何涉及的文件发生更改,缓存将自动失效。 - 如果安装依赖项的步骤很昂贵(
npm install
、pip install
、bundle install
、...),那么第一步只需COPY
列出依赖项的文件,然后是RUN whatever install
,然后是COPY
应用程序的其余部分。如果仅更改了应用程序代码,这可以避免使 "install" 步骤的缓存无效。 - 如果您有基于 Debian 或 Ubuntu 的映像,则
RUN apt-get update && apt-get install
在单个命令中。这避免了 "update" 步骤中的 URL 被缓存,但 "install" 步骤中的包发生变化,缓存的 URL 不再有效的问题。