生成缓存失效

构建镜像时,Docker 会逐步按照 Dockerfile 中,按指定的顺序执行每个 Dockerfile。对于每个指令,构建器会检查它是否可以重用 指令。

一般规则

构建缓存失效的基本规则如下:

  • 构建器首先检查基础镜像是否已缓存。每 将后续指令与缓存层进行比较。如果没有缓存 layer 与指令完全匹配,则缓存无效。

  • 在大多数情况下,将 Dockerfile 指令与相应的 cached layer 就足够了。但是,某些说明需要额外的 检查和解释。

  • 对于 和 说明,以及带有 bind 的说明 mounts () 时,构建器会计算缓存校验和 from file 元数据来确定缓存是否有效。在缓存查找期间, 如果任何文件的文件元数据已更改,则缓存将失效 涉及。ADDCOPYRUNRUN --mount=type=bind

    在以下情况下,不考虑文件的修改时间 () 计算缓存校验和。如果只有复制的文件具有 changed,则缓存不会失效。mtimemtime

  • 除了 and 命令之外,缓存检查不会查看 文件来确定缓存匹配项。例如,在处理 命令,用于在容器中更新的文件 来确定是否存在缓存命中。在那种情况下,只需 命令字符串本身用于查找匹配项。ADDCOPYRUN apt-get -y update

一旦缓存失效,所有后续 Dockerfile 命令都会生成新的 镜像,并且不使用缓存。

如果您的构建包含多个层,并且您希望确保构建缓存为 reusable 中,将指令从 LESS CHANGED IN 排序为 MORE 尽可能频繁更改。

RUN 指令

指令的缓存不会在构建之间自动失效。 假设您的 Dockerfile 中有一个步骤要安装:RUNcurl

FROM alpine:3.21 AS install
RUN apk add curl

这并不意味着镜像中的 版本始终是最新的。 一周后重新构建镜像仍将为您提供与以前相同的软件包。 要强制重新执行指令,您可以:curlRUN

  • 确保图层在更改之前
  • 在构建之前使用 docker builder prune 清除构建缓存
  • 使用 or 选项--no-cache--no-cache-filter

该选项允许您指定特定的构建阶段 使以下项的缓存无效:--no-cache-filter

$ docker build --no-cache-filter install .

构建密钥

生成密钥的内容不是生成缓存的一部分。 更改密钥的值不会导致缓存失效。

如果要在更改 secret 值后强制缓存失效,请执行以下操作: 您可以传递具有任意值的 build 参数,您也可以在更改密钥时更改该值。 构建参数确实会导致缓存失效。

FROM alpine
ARG CACHEBUST
RUN --mount=type=secret,id=TOKEN,env=TOKEN \
    some-command ...
$ TOKEN="tkn_pat123456" docker build --secret id=TOKEN --build-arg CACHEBUST=1 .

密钥的属性(如 ID 和挂载路径)确实参与缓存 checksum,如果更改,则会导致缓存失效。