缓存存储后端
为了确保快速构建,BuildKit 自动将构建结果缓存在其自己的内部缓存中。此外,BuildKit 还支持将构建缓存导出到外部位置,从而可以在将来的构建中导入。
在 CI/CD 构建环境中,外部缓存几乎变得至关重要。此类环境通常在运行之间几乎没有持久性,但保持映像构建的运行时间尽可能低仍然很重要。
默认docker
驱动程序支持inline
和local
缓存后端。其他缓存后端要求您选择不同的
驱动程序。
警告
如果您在构建过程中使用机密或凭据,请确保使用专用
--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
缓存后端支持的。
例如,要使用压缩registry
来压缩缓存zstd
:
$ 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 将自动检测要使用的正确媒体类型。