导出器概览
导出器将您的构建结果保存到指定的输出类型。您可以通过
--output CLI 选项
指定要使用的导出器。Buildx 支持以下导出器:
image: 将构建结果导出为容器镜像。registry: 将构建结果导出为容器镜像,并将其推送到指定的注册表。local: 将构建根文件系统导出到本地目录。tar: 将构建根文件系统打包到本地 tarball 中。oci: 将构建结果导出到本地文件系统,采用 OCI 镜像布局格式 。docker: 将构建结果导出到本地文件系统,采用 Docker 镜像规范 v1.2.0 格式。cacheonly: 不导出构建输出,但会运行构建并创建缓存。
使用导出器
要指定导出器,请使用以下命令语法:
$ docker buildx build --tag <registry>/<image> \
--output type=<TYPE> .
最常见的使用场景不需要你显式指定要使用哪个导出器。只有当你打算自定义输出或将其保存到磁盘时,才需要指定导出器。--load 和 --push 选项允许 Buildx 推断要使用的导出器设置。
例如,如果您将 --push 选项与 --tag 结合使用,Buildx
会自动使用 image 导出器,并将导出器配置为将结果推送到指定的注册表。
为了充分利用 BuildKit 提供的各种导出器的灵活性,
您使用 --output 标志来配置导出器选项。
使用案例
每种导出器类型都针对不同的使用场景设计。以下各节描述了一些常见场景,以及如何使用导出器生成您需要的输出。
加载到镜像仓库
Buildx 通常用于构建容器镜像,这些镜像可以加载到镜像存储中。这就是 docker 导出器的作用。以下示例展示了如何使用 docker 导出器构建镜像,并使用 --output 选项将该镜像加载到本地镜像存储中:
$ docker buildx build \
--output type=docker,name=<registry>/<image> .
Buildx CLI 会在您提供 --tag 和 --load 选项时,自动使用 docker 导出器并将其加载到镜像存储中:
$ docker buildx build --tag <registry>/<image> --load .
使用 docker 驱动程序构建的镜像会自动加载到本地镜像存储中。
加载到镜像仓库的镜像在构建完成后会立即对 docker run 可用,当你运行 docker images 命令时,你将看到镜像列表。
推送到注册表
要将构建的镜像推送到容器注册表,可以使用 registry 或
image 导出器。
当你将 --push 选项传递给 Buildx CLI 时,你指示 BuildKit 将构建的镜像推送到指定的注册表:
$ docker buildx build --tag <registry>/<image> --push .
在底层,这使用了 image 导出器,并设置了 push 参数。
这与使用以下长格式命令并使用 --output
选项相同:
$ docker buildx build \
--output type=image,name=<registry>/<image>,push=true .
你也可以使用registry 导出器,它会做同样的事情:
$ docker buildx build \
--output type=registry,name=<registry>/<image> .
导出镜像布局到文件
您可以使用 oci 或 docker 导出器将构建结果保存到本地文件系统上的镜像布局。这两个导出器都会生成一个包含相应镜像布局的 tar 归档文件。dest 参数定义了 tarball 的目标输出路径。
$ docker buildx build --output type=oci,dest=./image.tar .
[+] Building 0.8s (7/7) FINISHED
...
=> exporting to oci image format 0.0s
=> exporting layers 0.0s
=> exporting manifest sha256:c1ef01a0a0ef94a7064d5cbce408075730410060e253ff8525d1e5f7e27bc900 0.0s
=> exporting config sha256:eadab326c1866dd247efb52cb715ba742bd0f05b6a205439f107cf91b3abc853 0.0s
=> sending tarball 0.0s
$ mkdir -p out && tar -C out -xf ./image.tar
$ tree out
out
├── blobs
│ └── sha256
│ ├── 9b18e9b68314027565b90ff6189d65942c0f7986da80df008b8431276885218e
│ ├── c78795f3c329dbbbfb14d0d32288dea25c3cd12f31bd0213be694332a70c7f13
│ ├── d1cf38078fa218d15715e2afcf71588ee482352d697532cf316626164699a0e2
│ ├── e84fa1df52d2abdfac52165755d5d1c7621d74eda8e12881f6b0d38a36e01775
│ └── fe9e23793a27fe30374308988283d40047628c73f91f577432a0d05ab0160de7
├── index.json
├── manifest.json
└── oci-layout
导出文件系统
如果你不想从构建结果中构建镜像,而是导出构建的文件系统,你可以使用 local 和 tar 导出器。
local 导出器将文件系统解包到指定位置的目录结构中。tar 导出器创建一个 tarball 归档文件。
$ docker buildx build --output type=local,dest=<path/to/output> .
local 导出器在
多阶段构建
中很有用,因为它允许你仅导出最少数量的构建产物,例如自包含的Binaries。
仅缓存导出
如果只想运行构建而不导出任何输出,可以使用 cacheonly 导出器。例如,您可能想运行一个测试构建。或者,您可能想先运行构建,然后使用后续命令创建导出。 cacheonly 导出器会创建构建缓存,因此任何后续构建都会立即完成。
$ docker buildx build --output type=cacheonly
如果你没有指定导出器,也没有提供自动选择适当导出器的简写选项(如--load),Buildx 默认使用 cacheonly 导出器。除非你使用 docker 驱动程序进行构建,在这种情况下将使用 docker 导出器。
当使用 cacheonly 作为默认值时,Buildx 会记录警告消息:
$ docker buildx build .
WARNING: No output specified with docker-container driver.
Build result will only remain in the build cache.
To push result image into registry use --push or
to load image into docker use --load
多个导出器
你可以通过多次指定--output
标志为任何给定的构建使用多个导出器。这需要Buildx 和 BuildKit版本 0.13.0
或更高版本。
以下示例使用三个不同的导出器运行单个构建:
- 将镜像推送到仓库的
registry导出器 - 用于将构建结果提取到本地文件系统的
local导出器 - 将结果加载到本地镜像存储区的
--load标志(image导出器的简写)。
$ docker buildx build \
--output type=registry,tag=<registry>/<image> \
--output type=local,dest=<path/to/output> \
--load .
配置选项
本节描述了可用于导出器的一些配置选项。
此处描述的选项至少适用于两种或两种以上的导出器类型。 此外,不同的导出器类型还支持特定的参数。 有关适用于哪些配置参数的详细信息,请参阅有关每个导出器的详细页面。
此处描述的常用参数是:
压缩
当你导出压缩输出时,可以配置要使用的具体压缩算法和级别。虽然默认值提供了良好的开箱即用体验,但你可能希望调整参数以在存储与计算成本之间进行优化。更改压缩参数可以减少所需的存储空间,并提高镜像下载速度,但会增加构建时间。
要选择压缩算法,可以使用compression选项。例如,要使用compression=zstd构建image:
$ docker buildx build \
--output type=image,name=<registry>/<image>,push=true,compression=zstd .
使用 compression-level=<value> 选项与 compression 参数一起
为支持压缩级别的算法选择压缩级别:
- 0-9 代表
gzip和estargz - 0-22 for
zstd
一般来说,数值越高,生成的文件越小,压缩所需的时间越长。
使用 force-compression=true 选项来强制重新压缩从先前镜像导入的层,如果请求的压缩算法与先前的压缩算法不同。
注意
gzip和estargz压缩方法使用compress/gzip包, 而zstd使用github.com/klauspost/compress/zstd包。
OCI 媒体类型
image、registry、oci 和 docker 导出器用于创建容器镜像。
这些导出器同时支持 Docker 媒体类型(默认)和 OCI 媒体类型。
要导出设置了 OCI 媒体类型属性的镜像,请使用 oci-mediatypes 属性。
$ docker buildx build \
--output type=image,name=<registry>/<image>,push=true,oci-mediatypes=true .
接下来是什么
阅读有关每个导出器的介绍,了解它们的工作原理和使用方法: