使用 docker history --no-trunc $image
命令检查正在构建的不同镜像的层。在复制步骤中,您将看到被复制文件的 "file:abc" 哈希值:
IMAGE CREATED CREATED BY SIZE COMMENT
sha256:202cb043f70a2565ea40629e891642e1e24be7b52e29116a6520736f47183904 9 minutes ago /bin/sh -c #(nop) COPY file:d523f0d1cac93e44179baf9c36a7a4feff221b604224e26900075ddb02812448 in /test/test.txt 12B
如果正在构建的两个镜像之间哈希值不同,那么将使构建缓存无效并导致缓存未命中。请注意,文件的元数据也可能会导致缓存未命中,特别是文件权限。如果仍然遇到问题,请更新问题以包括不同构建的docker history --no-trunc ...
输出。
https://docs.docker.com/develop/develop-images/#leverage-build-cache
从Docker 20.10开始,如果您使用BuildKit,则COPY
和ADD
命令添加了一个--chmod
参数(尚未在{{link2:文档中提及)}}。因此,您可以确保镜像权限一致,并避免由权限引起的缓存错误,例如:
COPY --chmod=<4字节八进制掩码> ...
docker build
仅支持内联缓存(请参见 此处),docker buildx
(或直接使用 BuildKit)支持两种方法(请参见 此处),Buildah 和 kaniko 仅支持注册表缓存。ARG
,很容易意外破坏缓存失效。每当某个 ARG
的值在两个 docker build
执行之间不同时,第二个执行将无法重用先前缓存的层用于使用 ARG
值的 RUN
或 ENV
命令,这也使得所有后续层都失效。有关背景信息,请参见 此处。如果您使用多阶段构建,并且如果您运行 docker build
多次(针对不同的目标),请确保您始终向所有 docker build 调用提供相同的 ARG 值!FROM
语句中引用)时,整个镜像会被重新构建。特别是如果您使用 docker build --pull
。您需要密切关注构建器的第一层输出,其中包括基础镜像的 SHA-256 校验和。如果它经常改变,就没有真正的“解决方法”。您的镜像应该被重建,以包括基础镜像的最新安全修复程序。但是,如果基础镜像经常重新构建(例如每天多次),则可能希望停止使用 --pull
标志,而是采用仅更少地运行 docker pull <base image>
(或删除基础镜像)的不同方法,例如每天一次。COPY
或 ADD
语句的层在文件更改时会“意外”重建,这些文件您尚未关注(您尚未通过 .dockerignore
将它们排除)。这可能是 .git
文件夹,或者在构建/测试期间创建的文件(例如单元测试报告文件或日志文件)。当运行 COPY . .
时,通常会发生这种情况,因为然后整个项目目
%20https
不是有效的协议,即使将其更改为https
也会出现错误)。无论如何,StackOverflow指南要求您在问题本身中共享不起作用的代码,以便我们可以查看它。 - Bakuriu