Docker Buildx 构建多架构镜像
本文最后更新于 2024-05-22,文章内容可能已经过时。
Docker Buildx 构建多架构镜像
简介
buildx
是 Docker 官方提供的一个构建工具,它可以帮助用户快速、高效地构建 Docker 镜像,并支持多种平台的构建。使用 buildx,用户可以在单个命令中构建多种架构的镜像,例如 x86 和 ARM 架构,而无需手动操作多个构建命令。此外,buildx 还支持 Dockerfile 的多阶段构建和缓存,这可以大大提高镜像构建的效率和速度。
安装
buildx 是一个管理 Docker 构建的 CLI 插件,底层使用 BuildKit 扩展了 Docker 构建功能。
##blue##
BuildKit 是 Docker 官方提供的一个高性能构建引擎,可以用来替代 Docker 原有的构建引擎。相比于原有引擎,BuildKit 具有更快的构建速度、更高的并行性、更少的资源占用和更好的安全性。
要安装并使用 buildx,需要 Docker Engine 版本号大于等于 19.03。
如果你使用的是 Docker Desktop,则默认安装了 buildx。可以使用 docker buildx version 命令查看安装版本,得到以下类似输出,证明已经安装过了。
$ docker buildx version
github.com/docker/buildx v0.9.1 ed00243a0ce2a0aee75311b06e32d33b44729689
如果需要手动安装,可以从 GitHub 发布页面下载对应平台的最新二进制文件,重命名为 docker-buildx,然后将其放到 Docker 插件目录下(Linux/Mac 系统为 $HOME/.docker/cli-plugins,Windows 系统为 %USERPROFILE%.docker\cli-plugins)。
Linux/Mac 系统还需要给插件增加可执行权限 chmod +x ~/.docker/cli-plugins/docker-buildx,之后就可以使用 buildx 了。
更详细的安装过程可以参考官方文档。
使用
1.使用 imagetools 来检查跨平台镜像的 manifest 信息
$ docker buildx imagetools inspect jianghushinian/hello-go
Name: docker.io/jianghushinian/hello-go:latest
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest: sha256:51199dadfc55b23d6ab5cfd2d67e38edd513a707273b1b8b554985ff562104db
Manifests:
Name: docker.io/jianghushinian/hello-go:latest@sha256:8032a6f23f3bd3050852e77b6e4a4d0a705dfd710fb63bc4c3dc9d5e01c8e9a6
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/arm64
Name: docker.io/jianghushinian/hello-go:latest@sha256:fd46fd7e93c7deef5ad8496c2cf08c266bac42ac77f1e444e83d4f79d58441ba
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/amd64
可以看到,这个跨平台镜像包含了两个目标平台的镜像,分别是 linux/arm64
和 linux/amd64
2.用 docker buildx 来构建跨平台镜像
$ docker buildx build --platform linux/arm64,linux/amd64 -t jianghushinian/hello-go .
docker buildx build
语法跟 docker build
一样,--platform
参数表示构建镜像的目标平台,-t
表示镜像的 Tag,. 表示上下文为当前目录。
唯一不同的是对 --platform
参数的支持,docker build
的 --platform
参数只支持传递一个平台信息,如 --platform linux/arm64
,也就是一次只能构建单个平台的镜像。
而使用 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
这条警告提示我们没有为 docker-container
驱动程序指定输出,生成结果将只会保留在构建缓存中,使用 --push 可以将镜像推送到 Docker Hub 远程仓库,使用 --load
可以将镜像保存在本地。
这是因为我们新创建的 mybuilder
是启动了一个容器来运行 BuildKit
,它并不能直接将构建好的跨平台镜像输出到本机或推送到远程,必须要用户来手动指定输出位置。
我们可以尝试指定 --load
将镜像保存的本地主机。
$ docker buildx build --platform linux/arm64,linux/amd64 -t jianghushinian/hello-go --load .
[+] Building 0.0s (0/0)
ERROR: docker exporter does not currently support exporting manifest lists
结果会得到一条错误日志。看来它并不支持直接将跨平台镜像输出到本机,这其实是因为传递了多个 --platform 的关系,如果 --platform 只传递了一个平台,则可以使用 --load 将构建好的镜像输出到本机。
那么我们就只能通过 --push 参数将跨平台镜像推送到远程仓库了。不过在此之前需要确保使用 docker login 完成登录。
$ docker buildx build --platform linux/arm64,linux/amd64 -t jianghushinian/hello-go --push .
现在登录 Docker Hub 就可以看见推送上来的跨平台镜像了。
- 感谢你赐予我前进的力量