如何查看哪个文件导致Dockerfile`COPY`语句使缓存无效?

Dea*_*her 8 docker dockerfile

docker build .将重建Dockerfile当前目录中给定的docker镜像,并忽略与该.dockerignore文件匹配的任何路径.

COPY如果磁盘上的文件与上次构建的文件不同,则该Dockerfile中的任何语句都将导致构建缓存失效.

我注意到如果你不忽略.gitdir,那些git fetch没有副作用的简单事情将导致构建缓存失效(可能是因为.gitdir中的某些跟踪信息已经改变.

如果我知道如何准确地查看哪些文件导致缓存失效,那将非常有用......但我一直无法找到方法.

Mat*_*att 3

我认为当前的Docker 镜像设计没有办法查看哪个文件使缓存失效。

自 v1.10 起,图层和图像都是“内容可寻址的”。他们的 ID 基于反映其内容的 SHA256 校验和。

缓存代码只是查找镜像/层的 ID,只有当整个层的内容匹配(或者可能发生冲突)时,该 ID 才会存在于 Docker 引擎中。

因此,当您运行时docker build,将为 .txt 文件中的每个命令创建一个新的构建上下文Dockerfile。为命令将生成的整个层计算校验和。然后 docker 检查现有层是否可以使用该校验和并运行配置。

我能看到获取单个文件详细信息的唯一方法是重新计算目标文件校验和,这可能会抵消大部分缓存速度。如果您确实想这样做,另一个问题是决定针对哪一层进行检查。您必须查找先前的图像构建树(可能通过标签?)以查找先前可比较层的内容是什么。