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

标签 docker dockerfile

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

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

我注意到,如果你不忽略 .git 目录,像 git fetch 这样没有副作用的简单操作会导致构建缓存失效(可能是因为 .git 目录中的某些跟踪信息已更改。

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

最佳答案

我认为没有办法使用当前 Docker image design 查看哪个文件使缓存无效.

图层和图像since v1.10 are 'content addressable' .他们的 ID 基于反射(reflect)其内容的 SHA256 校验和。

caching code只需查找仅在整个层的内容匹配(或可能发生冲突)时才会存在于 Docker 引擎中的图像/层的 ID。

因此,当您运行 docker build 时,会为 Dockerfile 中的每个命令创建一个新的构建上下文。为该命令将产生的整个层计算校验和。然后 docker 检查是否存在具有该校验和的现有层并运行配置。

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

关于docker - 如何查看哪些文件导致 Dockerfile `COPY` 语句使缓存无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39217823/

相关文章:

linux - 在 docker 中运行 React 实例之前运行 bash 脚本?

c++ - 在windows docker容器中编译Qt5项目

java - 使用 Docker 进行 Spring 启动安全配置

docker - 使用Dockerfile执行两个命令

docker - 使用来自 docker-compose 的 Dockerfile 中定义的卷

Docker 的错误 : libselinux conflicts with fakesystemd

docker - 创建后将Docker Machine添加到Swarm集群

shell - 在ssh shell脚本中检查docker版本

docker - 如何从另一个 Dockerfile 生成 Dockerfile?

postgresql - 如何解决空 docker-entrypoint-initdb.d 的问题? (PostgresQL + docker )