跳转至

构建多种系统架构支持的镜像

想要构建多平台的镜像,有两种方式可以考虑:

  • 在不同的架构系统上分别构建自己的镜像并上传 (不同名称的镜像名不能一样,否则会覆盖)
  • 基于Docker提供的buildx工具,在任意架构平台的系统上,一次性构建并上传多平台镜像

第一种就不说了,因为它并不方便,也不实用,而且也麻烦

事实上,只要你稍微关注Docker Hub,就会发现基本上主流的镜像,都是支持多架构的.

如上图所示, JDK的Docker同一个镜像支持非常多不同的平台.

新建 builder 实例

Docker for Linux 不支持构建 arm 架构镜像,我们可以运行一个新的容器让其支持该特性

创建一个多架构的构建实例

buildx默认使用的是docker驱动,这个是不支持多平台构建的.所以我们需要切换使用docker-container驱动,这个驱动是特别支持多平台构建的

docker buildx create --use \
  --name multi-arch-builder \
  --driver docker-container \
  --platform linux/amd64,linux/arm64 \
  --buildkitd-flags "--oci-worker-net=cni" \
  --buildkitd-flags '--allow-insecure-entitlement security.insecure' \
  --driver-opt image=moby/buildkit:buildx-stable-1

构建镜像

新建 Dockerfile 文件

# syntax=docker-registry.local.liaosirui.com:5000/third/docker.io/docker/dockerfile:1.4.3

FROM --platform=$TARGETPLATFORM alpine

RUN uname -a > /os.txt

CMD cat /os.txt

使用这个实例进行构建

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  --file ./build/docker/Dockerfile \
  --progress plain \
  --pull \
  --push \
  -t docker-registry.local.liaosirui.com:5000/test/alpine:master_latest \
  .
  • --push 参数表示将构建好的镜像推送到仓库

在不同架构运行该镜像,可以得到该架构的信息

# arm64
> docker pull --platform arm64 docker-registry.local.liaosirui.com:5000/test/alpine:master_latest
> docker run -it --rm docker-registry.local.liaosirui.com:5000/test/alpine:master_latest
Linux buildkitsandbox 5.14.0-70.30.1.el9_0.x86_64 #1 SMP PREEMPT Thu Nov 3 20:29:04 UTC 2022 aarch64 Linux

# arm64 可以使用
#   docker create --name test-arm64 docker-registry.local.liaosirui.com:5000/test/alpine:master_latest
#   docker cp test-arm64:/os.txt ./os.txt
#   cat ./os.txt
#   Linux buildkitsandbox 5.14.0-70.30.1.el9_0.x86_64 #1 SMP PREEMPT Thu Nov 3 20:29:04 UTC 2022 aarch64 Linux

# amd64
> docker pull --platform amd64 docker-registry.local.liaosirui.com:5000/test/alpine:master_latest
> docker run -it --rm docker-registry.local.liaosirui.com:5000/test/alpine:master_latest
Linux buildkitsandbox 5.14.0-70.30.1.el9_0.x86_64 #1 SMP PREEMPT Thu Nov 3 20:29:04 UTC 2022 x86_64 Linux