缓存存储后端
为了确保快速构建,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 缓存(始终启用)不同,所有缓存存储后端都必须显式导出和导入。
使用registry
后端,使用导入和导出缓存的示例 buildx
命令
$ 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 目前仅支持 单个缓存导出器。但是您可以从任意数量的远程缓存中导入。例如,一种常见的模式是同时使用当前分支和主分支的缓存。以下示例演示了使用 registry 缓存后端从多个位置导入缓存。
$ 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
。例如,要使用 registry 后端以 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> .