前言

https://github.com/OpenIMSDK/Open-IM-Server/issues/432

现在很多地方都对服务的国产化适配有所要求,一般的国产化平台都提供arm版本的linux云环境供我们进行服务部署,因此需要构建arm版本的镜像。

Docker Hub 上的大多数 Docker 官方镜像都提供了多种架构。例如,busybox图像支持amd64arm32v5arm32v6、 arm32v7arm64v8i386ppc64le、 和s390xx86_64当在/机器上运行此映像时amd64,该amd64变体将被拉出并运行。

当您调用构建时,您可以设置标志--platform来指定构建输出的目标平台(例如,linux/amd64linux/arm64或 darwin/amd64)。

当当前构建器实例由驱动程序支持时docker-container,您可以一起指定多个平台。在这种情况下,它构建一个清单列表,其中包含所有指定架构的图像。docker run当您在或 中使用此映像时docker service,Docker 会根据节点的平台选择正确的映像。

您可以使用 Buildx 和 Dockerfiles 支持的三种不同策略构建多平台映像:

  1. 使用内核中的 QEMU 模拟支持
  2. 使用相同的构建器实例在多个本机节点上构建
  3. 使用 Dockerfile 中的阶段交叉编译到不同的架构

如果您的节点已经支持 QEMU(例如,如果您正在使用 Docker Desktop),QEMU 是最简单的入门方法。它不需要更改您的 Dockerfile,并且 BuildKit 会自动检测可用的辅助架构。当 BuildKit 需要运行不同架构的二进制文件时,它会通过binfmt_misc 处理程序中注册的二进制文件自动加载它。

binfmt_misc为了使在主机操作系统上注册的 QEMU 二进制文件能够在容器内透明地工作,它们必须使用该fix_binary标志进行静态编译和注册。这需要内核 >= 4.8 和 binfmt-support >= 2.1.7。F您可以通过检查中的标志是否包含来检查是否正确注册 /proc/sys/fs/binfmt_misc/qemu-*。虽然 Docker Desktop 预先配置了binfmt_misc对其他平台的支持,但对于其他安装,它可能需要使用 tonistiigi/binfmt 映像进行安装。

docker run --privileged --rm tonistiigi/binfmt --install all

使用多个本机节点可以为 QEMU 无法处理的更复杂的情况提供更好的支持,并且通常具有更好的性能。您可以使用该标志将其他节点添加到构建器实例--append

假设上下文node-amd64node-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 .