前言:
在之前的docker版本中,我们需要用到multiarch的镜像来实现交叉编译不同架构的镜像。
在docker 19.03之后的新版本,增加了buildx 功能,可以实现跨平台编译
步骤:
1、开启buildx功能
Docker Buildx能够同时为多个不同配置的镜像构建,其作为实验性功能包含在Docker 19.03版本中。要使用Buildx,首先需要开启Docker CLI(而不是Daemon)的实验性功能:按Docker官方网站指南安装19.03版本的Docker后,在Docker CLI配置文件~/.docker/config.json
文件中添加"experimental": "enabled"
设置
要想使用 buildx,首先要确保 Docker 版本不低于 19.03,同时还要通过设置环境变量 DOCKER_CLI_EXPERIMENTAL 来启用。可以通过下面的命令来为当前终端启用 buildx 插件:
export DOCKER_CLI_EXPERIMENTAL=enabled
(若使用root用户运行Docker CLI,则为/root/.docker/config.json
),示例文件如下。
{ "experimental": "enabled" }
若能使用docker buildx version
命令,说明已经成功启用Docker Buildx。
2、开启QEMU
QEMU是一款功能强大的仿真器软件,它以用户模式运行时,能够直接启动其他架构的程序而不需要仿真整个操作系统。可以运行以下命令,使用Docker安装并在binfmt_misc中注册QEMU,给本机提供运行其他架构Docker镜像的能力(参见multiarch/qemu-user-static | Github:
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
尝试运行以下命令,若能成功运行,说明已经成功配置QEMU:
docker run --rm -t arm64v8/ubuntu uname -m # 输出:aarch64
当然,这个docker的镜像只支持宿主机为x64的cpu的环境。
其他架构的情况,可以直接安装qemu
sudo apt-get install qemu-user-static
3、开启新的builder:
docker buildx create --use --name mybuilder
4、然后就可以使用Buildx为所需的架构构建Docker镜像。
以https://github.com/scjtqs/docker-kodbox 为例:
cd php-fpm docker buildx build --tag scjtqs/kodbox:latest --platform linux/amd64,linux/arm64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7 --push .
该命令会分别以linux/amd64、linux/arm64、linux/ppc64le、linux/s390x、linux/386、linux/arm/v7这几种架构运行Dockerfile指定的构建步骤,并将构建结果推送到Docker Hub中。
PS:请确保你的FROM的镜像支持 对应的架构
5、关闭builder:
docker buildx rm mybuilder