docker build .
将重建当前目录中Dockerfile
的docker镜像,并忽略与.dockerignore
文件匹配的所有路径。
如果磁盘上的文件与上次构建的文件不同,那么Dockerfile中的任何COPY
语句都会导致构建缓存失效。
我注意到如果你不忽略.git
目录,那么没有副作用的git fetch
这样简单的事情会导致构建缓存失效(推测)因为.git
目录中的某些跟踪信息已发生变化。
如果我知道如何确切地看到哪些文件导致缓存失效,那将非常有用......但我一直无法找到一种方式。
答案 0 :(得分:2)
我认为没有办法查看哪个文件使用当前Docker image design使缓存无效。
图层和图片since v1.10 are 'content addressable'。他们的ID基于SHA256校验和,反映了他们的内容。
如果整个图层的内容匹配(或可能是碰撞),caching code只会查找仅存在于Docker Engine中的图像/图层的ID。
因此,当您运行docker build
时,会为Dockerfile
中的每个命令创建一个新的构建上下文。计算命令将生成的整个层的校验和。然后,docker会检查现有图层是否可用该校验和并运行config。
我能看到获取单个文件详细信息的唯一方法是重新计算目标文件校验和,这可能会抵消大部分缓存加速。如果你确实想要这样做,另一个问题是决定检查哪一层。您必须查找以前的图像构建树(可能是通过标记?)来查找先前可比较图层的内容。