本地缓存

local 缓存存储是一个简单的缓存选项,它将你的缓存作为文件存储在文件系统的一个目录中,使用 OCI 镜像布局 作为底层目录结构。如果你只是进行测试,或者想要灵活地自行管理共享存储解决方案,本地缓存是一个不错的选择。

概要

$ docker buildx build --push -t <registry>/<image> \
  --cache-to type=local,dest=path/to/local/dir[,parameters...] \
  --cache-from type=local,src=path/to/local/dir .

下表描述了可以传递给 --cache-to--cache-from 的可用 CSV 参数。

名称选项类型默认值描述
srccache-from字符串缓存导入来源的本地目录路径。
digestcache-from字符串要导入的 manifest 的摘要,参见 缓存版本控制
destcache-to字符串缓存导出目标的本地目录路径。
modecache-tomin,maxmin要导出的缓存层,参见 缓存模式
oci-mediatypescache-totrue,falsetrue在导出的 manifest 中使用 OCI 媒体类型,参见 OCI 媒体类型
image-manifestcache-totrue,falsefalse使用 OCI 媒体类型时,为缓存镜像生成镜像 manifest 而非镜像索引,参见 OCI 媒体类型
compressioncache-togzip,estargz,zstdgzip压缩类型,参见 缓存压缩
compression-levelcache-to0..22压缩级别,参见 缓存压缩
force-compressioncache-totrue,falsefalse强制应用压缩,参见 缓存压缩
ignore-errorcache-to布尔值false忽略由缓存导出失败引起的错误。

如果 src 缓存不存在,则缓存导入步骤将失败,但构建会继续。

缓存版本控制

本节描述了本地文件系统上缓存的版本控制工作原理,以及如何使用 digest 参数使用旧版本的缓存。

如果你手动检查缓存目录,可以看到结果的 OCI 镜像布局

$ ls cache
blobs  index.json  ingest
$ cat cache/index.json | jq
{
  "schemaVersion": 2,
  "manifests": [
    {
      "mediaType": "application/vnd.oci.image.index.v1+json",
      "digest": "sha256:6982c70595cb91769f61cd1e064cf5f41d5357387bab6b18c0164c5f98c1f707",
      "size": 1560,
      "annotations": {
        "org.opencontainers.image.ref.name": "latest"
      }
    }
  ]
}

与其他缓存类型一样,本地缓存会在导出时被替换,通过替换 index.json 文件的内容。然而,之前的缓存仍将保留在 blobs 目录中。这些旧缓存可以通过摘要寻址,并无限期保留。因此,本地缓存的大小将持续增长(有关更多信息,请参阅 moby/buildkit#1896)。

使用 --cache-from 导入缓存时,你可以指定 digest 参数来强制加载旧版本的缓存,例如

$ docker buildx build --push -t <registry>/<image> \
  --cache-to type=local,dest=path/to/local/dir \
  --cache-from type=local,ref=path/to/local/dir,digest=sha256:6982c70595cb91769f61cd1e064cf5f41d5357387bab6b18c0164c5f98c1f707 .

进一步阅读

有关缓存的介绍,请参阅 Docker 构建缓存

有关 local 缓存后端的更多信息,请参阅 BuildKit README

页面选项