Docker Buildx的
预计阅读时间:6分钟
概述
Docker Buildx是一个CLI插件,它扩展了docker命令,并完全支持Moby BuildKit 构建器工具包提供的功能。它提供了与docker build相同的用户体验,并具有许多新功能,例如创建范围内的构建器实例和同时针对多个节点进行构建。
安装
使用DEB或RPM软件包安装时,Docker Buildx将包含在Docker Desktop和Docker Linux软件包中。
您还可以buildx
从GitHub上的Docker buildx存储库下载最新的二进制文件
。
将buildx设置为默认构建器
运行该命令docker buildx install
会将docker builder命令设置为的别名docker buildx
。这样就可以docker build
使用当前的buildx构建器。
要删除此别名,请运行docker buildx uninstall
。
用buildx编译
要开始新的构建,请运行以下命令 docker buildx build .
$ docker buildx build .
[+] Building 8.4s (23/32)
=> ...
Buildx使用BuildKit引擎进行构建,不需要DOCKER_BUILDKIT=1
环境变量即可开始构建。
该docker buildx build
命令支持可用于的功能docker build
,包括输出配置,内联构建缓存和指定目标平台等功能。此外,Buildx还支持常规docker build
清单尚不可用的新功能,例如构建清单清单,分布式缓存以及将构建结果导出到OCI映像tarball。
您可以在通过驱动程序概念公开的不同配置中运行Buildx。当前,Docker支持使用捆绑在Docker守护进程二进制文件中的BuildKit库的“ docker”驱动程序,以及在Docker容器内自动启动BuildKit的“ docker-container”驱动程序。
跨驱动程序使用Buildx的用户体验非常相似。但是,“ docker”驱动程序当前不支持某些功能,因为捆绑到docker守护程序中的BuildKit库使用其他存储组件。相反,默认情况下,使用“ docker”驱动程序构建的所有映像都会自动添加到“ docker images”视图中,而在使用其他驱动程序时,需要使用来选择输出映像的方法--output
。
处理构建器实例
默认情况下,Buildx使用“ docker”驱动程序(如果受支持),从而提供与本机docker构建非常相似的用户体验。请注意,您必须使用本地共享守护程序来构建应用程序。
Buildx允许您创建隔离的构建器的新实例。您可以使用它来为您的CI构建获取范围内的环境,该环境不会更改共享守护程序的状态,或者为不同项目隔离构建。您可以为一组远程节点创建一个新实例,形成一个构建场,并在它们之间快速切换。
您可以使用docker buildx create
命令创建新实例。这将根据您当前的配置创建一个具有单个节点的新构建器实例。
要使用远程节点,可以DOCKER_HOST
在创建新构建器时指定或远程上下文名称。创建一个新的实例后,您可以使用管理其生命周期docker buildx inspect
,
docker buildx stop
和
docker buildx rm
命令。要列出所有可用的构建器,请使用docker buildx ls
。创建新的构建器之后,您还可以向其附加新节点。
要在不同的构建器之间切换,请使用docker buildx use <name>
。运行此命令后,构建命令将自动使用此构建器。
Docker还具有一个docker context
命令,可用于为远程Docker API端点提供名称。Buildx与Docker上下文集成,以确保所有上下文自动获得默认的构建器实例。创建新的构建器实例或向其添加节点时,也可以将上下文名称设置为目标。
构建多平台图像
BuildKit旨在很好地用于多个平台的构建,不仅适用于用户调用该构建运行的体系结构和操作系统。
当你调用一个构建,可以设置--platform
标志来指定目标平台为构建输出,(例如linux/amd64
,linux/arm64
或
darwin/amd64
)。
当当前构建器实例由“ docker-container”驱动程序支持时,您可以一起指定多个平台。在这种情况下,它将构建清单清单,其中包含所有指定体系结构的图像。在docker run
或中
使用此映像时docker service
,Docker会根据节点的平台选择正确的映像。
您可以使用Buildx和Dockerfiles支持的三种不同策略来构建多平台映像:
- 在内核中使用QEMU仿真支持
- 使用相同的构建器实例在多个本机节点上构建
- 使用Dockerfile中的一个阶段交叉编译为不同的架构
如果您的节点已经支持QEMU,那么QEMU是最简单的入门方法(例如,如果您使用的是Docker Desktop)。它不需要对Dockerfile进行任何更改,并且BuildKit会自动检测可用的辅助架构。当BuildKit需要为其他体系结构运行二进制文件时,它将通过在binfmt_misc
处理程序中注册的二进制文件自动加载。
使用多个本机节点可以为QEMU无法处理的更复杂的情况提供更好的支持,并且通常具有更好的性能。您可以使用该--append
标志将其他节点添加到构建器实例。
假设上下文node-amd64和node-arm64存在于中docker context ls
;
$ docker buildx create --use --name mybuild node-amd64
mybuild
$ docker buildx create --append --name mybuild node-arm64
$ docker buildx build --platform linux/amd64,linux/arm64 .
最后,根据您的项目,您使用的语言可能对交叉编译有很好的支持。在那种情况下,Dockerfiles中的多阶段构建可以有效地用于--platform
使用构建节点的本机体系结构为指定的平台构建二进制文件
。在Dockerfile中可以自动获得诸如BUILDPLATFORM
和之类的构建参数列表,TARGETPLATFORM
并且可以由作为构建一部分运行的进程加以利用。
# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM golang:alpine AS build
ARG TARGETPLATFORM
ARG BUILDPLATFORM
RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log
FROM alpine
COPY --from=build /log /log
高级构建选项
Buildx还旨在为高级构建概念提供支持,而不仅仅是调用单个构建命令。
BuildKit有效地处理多个并发的构建请求和重复数据删除工作。生成命令可以与通用命令运行程序(例如make
)结合使用。但是,这些工具通常按顺序调用构建,因此无法充分利用BuildKit并行化的全部潜力,也无法为用户组合BuildKit的输出。对于此用例,我们添加了一个名为的命令docker buildx bake
。
该bake
命令支持从撰写文件构建映像,类似于
docker-compose build
,但是允许将所有服务作为单个请求的一部分并发构建。