docker文件中有FROM、RUN等各种命令。每一个命令都会创建一个层(中间镜像)。
在构建过程中,假设图层已经存在,docker是根据什么来决定是创建一个新图层还是使用现有图层?
该 docker build
缓存系统非常简单。 对于大多数命令,如果前一层被缓存,而有一层运行完全相同的命令(RUN
, ENV
, CMD
...),那么它就会重复使用缓存层,并为下一条命令重复这个检查。 对于 COPY
和 ADD
命令的决定是基于文件内容的哈希值。
这在 编写Docker文件的最佳实践 在Docker文档中。
实际上,这意味着几件事。
docker build --no-cache
因为如果Dockerfile或任何涉及的文件发生了变化,缓存将自动失效。npm install
, pip install
, bundle install
,...)有一个第一步,只需 COPY
的文件,然后是 RUN whatever install
那么 COPY
应用程序的其余部分。 这样可以避免在 "安装 "步骤中,如果只有应用程序的代码发生了变化,缓存就会失效。RUN apt-get update && apt-get install
在一条命令中完成。 这就避免了 "更新 "步骤中的URL被缓存,但 "安装 "步骤中的包发生变化,缓存的URL不再有效的问题。