我无法确定Docker的本地构建缓存是否已自动清除。
如果将其清除,应该多久一次?这是我们可以配置的东西吗?有年龄限制或总缓存大小限制吗?
请注意,这个问题不是关于在构建映像时如何绕过缓存,也不是关于如何手动清除缓存,也不是关于如何利用缓存机制来加速Docker构建。这些问题已被广泛记录。这个问题的目的是找出Docker如何内部管理其构建缓存。如果不手动清除,它会永远存在吗?它会自行过期吗?怎么样?
答案 0 :(得分:0)
如果将其清除,应该多久一次?这是我们可以配置的东西吗?是 有年龄限制或总缓存大小限制?
您可以在Docker构建期间使用--no-cache
标志来使缓存无效。您无需配置,docker构建过程会在构建时检查每个层和指令,以从缓存或忽略的缓存中考虑。
在一个简单的世界中,泊坞窗在其末端构建过程控制缓存,并使用--no-cache
提供标志以使缓存无效。
但是,如果您确实让Docker使用其缓存,那么了解何时可以找到匹配的映像非常重要。 Docker遵循的基本规则概述如下:
利用构建缓存
构建映像时,Docker会逐步执行您中的说明 Dockerfile,以指定的顺序执行每个文件。作为各指示 经过检查,Docker在其缓存中寻找一个现有映像, 可以重复使用,而不是创建新的(重复的)图像。
从已在缓存中的父映像开始,下一个 将指令与从中得出的所有子图像进行比较 基本图像,以查看其中是否使用完全相同的图像构建 指令。如果不是,则缓存无效。
在大多数情况下,只需将Dockerfile中的指令与 一张子图像就足够了。但是,某些说明 需要更多的检查和解释。
对于
ADD and COPY
指令,文件中的内容 检查图像并为每个文件计算校验和。的 文件的上次修改时间和上次访问时间不是 在这些校验和中考虑。在缓存查找期间,校验和 与现有图像中的校验和进行比较。如果有什么 已更改文件(例如内容和元数据),然后 缓存无效。除了
ADD and COPY
命令外,缓存检查不会查看 容器中的文件以确定缓存是否匹配。例如, 处理RUN apt-get -y update
命令时,文件更新为 不检查容器以确定是否存在缓存命中。在 在这种情况下,只是使用命令字符串本身来查找匹配项。一旦缓存失效,所有后续的Dockerfile命令 生成新图像,并且不使用缓存。
dockerfile_best-practices-Leverage-build-cache
您可以探索--cache-from
使图层缓存保持一致
使用--cache-from
,您可以指定docker build将视为缓存层源的图像列表。因此,您可以不依赖未指定的本地状态,而可以依赖注册表中的标记图像。
答案 1 :(得分:0)
docker的构建缓存基于您在本地拥有的image
s。映像永远不会被自动删除,因此从本质上讲,构建缓存不会被删除
docker决定是否使用缓存的方法包括检查上一层和正在运行的命令是否相同
如果您删除了用于满足缓存条件的图像,则可以考虑“清除缓存”(另外docker system prune -f
会删除所有可能也是缓存元素的匿名图像)