缓存存储后端
为了确保快速构建,BuildKit 会在其内部缓存中自动缓存构建结果。此外,BuildKit 还支持将构建缓存导出到外部位置,以便在未来的构建中导入。
在 CI/CD 构建环境中,外部缓存几乎是必不可少的。此类环境通常在运行之间几乎没有或没有持久性,但仍然需要尽可能降低镜像构建的运行时间。
默认的 docker 驱动支持 inline、local、registry 和 gha 缓存后端,但仅在您已启用 containerd 镜像存储 的情况下。
其他缓存后端需要您选择不同的 驱动。
警告
如果你在构建过程中使用了密钥或凭据,请确保使用专用的
--secret选项来处理它们。 使用COPY或ARG手动管理密钥可能会导致凭据泄露。
后端
Buildx 支持以下缓存存储后端:
inline: 将构建缓存嵌入到镜像中。内联缓存会被推送到与主输出结果相同的位置。 这仅适用于
image导出器。registry: 将构建缓存嵌入到单独的镜像中,并推送到与主输出分开的专用位置。local: 将构建缓存写入文件系统上的本地目录。gha: 上传构建缓存到 GitHub Actions 缓存(测试版)。s3: 上传构建缓存到 AWS S3 存储桶 (未发布)。azblob: 上传构建缓存到 Azure Blob 存储 (未发布)。
命令语法
要使用任何缓存后端,您首先需要在构建时使用
--cache-to 选项
将其导出到您选择的存储后端。然后,使用
--cache-from 选项
从存储后端导入缓存到当前构建。与始终启用的本地 BuildKit 缓存不同,所有缓存存储后端都必须显式导出和显式导入。
示例 buildx 命令使用 registry 后端,使用导入和导出缓存:
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>[,parameters...] \
--cache-from type=registry,ref=<registry>/<cache-image>[,parameters...] .
警告
一般来说,每个缓存都会写入某个位置。没有一个位置可以被写入两次,否则会覆盖之前缓存的数据。如果你想维护多个作用域的缓存(例如,每个Git分支一个缓存),请确保为导出的缓存使用不同的位置。
多个缓存
BuildKit 目前仅支持 一个缓存导出器。但你可以导入任意数量的远程缓存。例如,常见的做法是使用当前分支和主分支的缓存。以下示例展示了使用注册表缓存后端从多个位置导入缓存:
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>:<branch> \
--cache-from type=registry,ref=<registry>/<cache-image>:<branch> \
--cache-from type=registry,ref=<registry>/<cache-image>:main .
配置选项
本节描述了在生成缓存导出时可用的一些配置选项。此处描述的选项至少适用于两种或更多后端类型。此外,不同的后端类型还支持特定的参数。有关适用于哪些配置参数的详细信息,请参阅每种后端类型的详细页面。
此处描述的常用参数是:
缓存模式
在生成缓存输出时,--cache-to 参数接受一个 mode
选项,用于定义在导出的缓存中包含哪些层。除 inline 缓存外,所有缓存后端都支持此功能。
模式可以设置为两个选项之一:mode=min 或 mode=max。例如,
使用注册表后端用 mode=max 构建缓存:
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>,mode=max \
--cache-from type=registry,ref=<registry>/<cache-image> .
此选项仅在导出缓存时设置,使用 --cache-to。导入缓存时(--cache-from),相关参数将自动检测。
在 min 缓存模式(默认)下,只有导出到最终镜像的层会被缓存,而在 max 缓存模式下,所有层都会被缓存,包括中间步骤的层。
虽然 min 缓存通常更小(这会加快导入/导出时间,并降低存储成本),但 max 缓存更有可能命中缓存。根据构建的复杂性和位置,您应该尝试两个参数,以找到最适合您的结果。
缓存压缩
缓存压缩选项与
导出器压缩选项
相同。这由
local
和
registry
缓存后端支持。
例如,使用zstd压缩级别压缩registry缓存:
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>,compression=zstd \
--cache-from type=registry,ref=<registry>/<cache-image> .
OCI 媒体类型
缓存 OCI 选项与
导出器 OCI 选项相同。这些选项由 local 和 registry 缓存后端支持。
例如,要导出 OCI 媒体类型缓存,请使用 oci-mediatypes 属性:
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>,oci-mediatypes=true \
--cache-from type=registry,ref=<registry>/<cache-image> .
此属性仅在使用 --cache-to 标志时有意义。获取缓存时,BuildKit 会自动检测要使用的正确媒体类型。
默认情况下,OCI 媒体类型会为缓存镜像生成一个镜像索引。
一些 OCI 注册表(例如 Amazon ECR)不支持镜像索引媒体类型:
application/vnd.oci.image.index.v1+json。如果你将缓存镜像导出到 ECR 或任何其他不支持镜像索引的注册表,请将
image-manifest 参数设置为 true,以生成单个镜像清单,而不是为缓存镜像生成镜像索引:
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>,oci-mediatypes=true,image-manifest=true \
--cache-from type=registry,ref=<registry>/<cache-image> .