前言

原本多架构其实我还遇到的不算多,但自从苹果的 M1 出来之后 arm64 版本支持就变成了一个常态,所以会常遇到需要多架构镜像都构建的情况。以前的 docker 版本需要你去编写 manifest 很麻烦,而今天就说说如何使用 docker buildx 来同时构建多架构的镜像,其实现在已经非常方便了。

目标:构建出 amd64 和 arm64 的 docker 镜像

创建 builder

默认你在 docker build 的时候直接指定 --platform linux/arm64,linux/amd64 就会报错,告诉你需要使用 docker buildx 而前提是你需要有一个 builder

1
2
$ docker buildx create --name mybuilder --driver docker-container
$ docker buildx use mybuilder

Linux 非 arm 下可能需要你先安装 https://github.com/tonistiigi/binfmt#installing-emulators 以支持 arm 平台的打包

构建

其实到这里已经非常简单的,就和原来的构建命令差不多,只是需要指定对应构建的架构即可

1
docker buildx build --platform linux/amd64,linux/arm64 -t linkinstar/app:latest .

当然,如何想要将构建完成的镜像直接 push 到镜像仓库,也可以追加参数 --push

1
docker buildx build --platform linux/amd64,linux/arm64 -t linkinstar/app:latest . --push

可能存在的问题

由于国内网络环境的问题,可以尝试使用 https://github.com/docker-practice/buildx 实际中我使用时发现和官方的还是有区别,所以竟可能还是用官方的 builder,实在不行可以考虑更换

1
2
3
4
5
6
7
8
# 添加了镜像设置,建议在国内环境使用
# 网易云镜像 二选一
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master

# 百度云镜像 二选一
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master-baidu

$ docker buildx use mybuilder-cn