Docker buildx构建多架构镜像
Docker 19.03及以上的版本支持docker buildx build
命令使用 BuildKit 来构建镜像。通过--platform
参数可以支持构建多架构的Docker镜像。
一、新建builder实例
由于Docker默认的builder实例不支持同时指定多个--platform
,所以必须先创建一个新的builder
实例。使用如下命令:
docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master
运行结果如下:
可以使用 docker buildx ls
来查看当前的实例,我这边显示:
二、安装模拟器和使能特性
Docker for Linux不支持构建 ARM 架构镜像,我们可以安装模拟器(用于多平台镜像构建) 让其支持该特性
docker run --rm --privileged tonistiigi/binfmt:latest --install all
运行结果如下所示:
- 另外,还需要使能实验特性
#使能实验特性
export DOCKER_CLI_EXPERIMENTAL=enabled
三、构建镜像
基础镜像一致的情况
新建一个Dockerfile文件
FROM --platform=$TARGETPLATFORM alpine
RUN uname -a > /os.txt
CMD cat /os.txt
基础镜像来源于不同的镜像
可以先将不同的基础镜像进行重命名,使用统一的前缀和不同的tag来区分,然后在dockerfile中使用变量 TARGETARCH来选择不同的基础镜像
#arm
# FROM registry.image.com/dev/baseimage:arm-v
# docker -t 重命名为 registry.image.com/dev/baseimage:arm64
#amd
# FROM registry.image.com/dev/baseimage:latest
# docker -t 重命名为 registry.image.com/dev/baseimage:amd64
FROM registry.image.com/video-analysis/baseimage:${TARGETARCH}
#如果在FROM时已经引用了变量TARGETARCH,则后续使用还需要ARG显示声明一次才能正常引用
ARG TARGETARCH
ADD bin/${TARGETARCH}/a.out /app/
WORKDIR /app
使用 docker buildx build
命令构建镜像:
docker buildx build --platform linux/arm64,linux/amd64 -t imagename/test-for-buildx . --push
--push
会将构建好的镜像推送到镜像仓库
--load
会将构建好的镜像load到本地
如下图是由于load参数不支持多镜像一起load,所以我分开进行build了,但是push是可以多镜像一起的
在不同架构运行该镜像,可以看到该架构的信息
# amd64
$ docker run -it --rm imagename/test-for-buildx
Linux buildkitsandbox 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 Linux
# arm64
docker run -it --rm imagename/test-for-buildx
WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
Linux buildkitsandbox 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 aarch64 Linux
架构相关变量
Dockerfile
支持如下变量
-
TARGETPLATFORM
构建镜像的目标平台,例如
linux/amd64
,linux/arm/v7
,windows/amd64
-
TARGETOS
TARGETPLATFORM
的 OS 类型,例如
linux,
windows -
TARGETARCH
TARGETPLATFORM 的架构类型,例如 amd64, arm
-
TARGETVARIANT
TARGETPLATFORM
的变种,该变量可能为空,例如
v7 -
BUILDPLATFORM
构建镜像主机平台,例如
linux/amd64
-
BUILDOS
BUILDPLATFORM
的 OS 类型,例如
linux -
BUILDARCH
BUILDPLATFORM
的架构类型,例如
amd64 -
BUILDVARIANT
BUILDPLATFORM
的变种,该变量可能为空,例如
v7
总结
docker buildx的工具,提供了当宿主机是x86 64的架构时,想构建镜像为ARM64的架构的能力,类似于交叉编译。