跳转至

多平台镜像构建

近期信创要求 需要使用 arm架构,增加多平台镜像构建。制作支持多种不同 CPU 架构的镜像。

buildx 介绍

buildx 是一个管理 Docker 构建的 CLI 插件, 底层使用 BuildKit 扩展了 Docker 构建功能。

驱动类型 运行方式 核心特点 适用场景
docker 使用 Docker 守护进程内置的 BuildKit 库,与 Docker 深度集成。 无需额外部署,默认模式,配置简单;与 Docker 生命周期绑定。 本地开发、单机构建、快速验证场景。
docker-container 通过 Docker 创建独立的 BuildKit 容器,隔离运行构建任务。 资源隔离性强,支持多版本 BuildKit 并存;便于升级和故障排查。 多环境协作、需要灵活管理 BuildKit 版本的场景。
kubernetes 在 Kubernetes 集群中创建 BuildKit Pod,利用 K8s 调度能力执行构建。 支持分布式构建、弹性扩缩容;适配云原生 CI/CD 流程,适合大规模集群环境。 云原生应用开发、持续集成 / 持续部署(CI/CD)、高并发构建任务。
remote 直接连接到手动管理的远程 BuildKit 守护进程(需提前部署并暴露接口)。 支持跨网络调用,构建任务与开发环境分离;可复用已有远程构建资源。 分布式架构、构建资源集中管理、跨团队协作或混合云场景。

使用 docker buildx 方式

安装 docker

curl -fsSL https://get.docker.com| bash -s docker --mirror Aliyun

设置 docker 源

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<EOF
{
  "ipv6": false,
  "proxies": {
    "http-proxy": "http://10.1.1.57:8081",
    "https-proxy": "http://10.1.1.57:8081"
  },
    "registry-mirrors": [
    "https://hub.docker.linuxnbg.com"
   ]
}
EOF

重启服务

systemctl daemon-reload
systemctl restart docker

buildx 使用

由于被墙了、所以使用自定义加速源。

创建自定义构建器

在使用 Buildx 之前,需要创建一个构建器实例,支持多平台构建且配置了代理的 builder 实例,并将其加载到本地 Docker 守护进程中

创建配置文件设置代理地址

cat config.toml

debug = true
[registry."docker.io"]
  mirrors = ["https://hub.docker.linuxnbg.com"]
创建构建器
docker buildx create --use --name datarc-builder --config config.toml

一次编译多平台镜像并推送

编译指定的多平台镜像加载到远端,平台之间需使用逗号隔开,使用 --builder 指定构建器。--push 配合 docker login 推送。

登录华为云 swr 镜像仓库

docker login 

编写测试 Dockerfile

# 使用 Python 3.10.17 的 Alpine 版本作为基础镜像
# Alpine 镜像体积小,适合构建轻量级容器
FROM python:3.10.17-alpine

# 设置工作目录
# 后续的操作将在该目录下执行
WORKDIR /app

# 运行 uname -a 命令,并将系统信息输出到 os1.txt 文件
# 使用非交互式 shell 确保命令执行的一致性
RUN uname -a > /app/os.txt

# 容器启动时执行的命令
# 查看 os1.txt 文件中的系统信息
CMD ["cat", "/app/os.txt"]

构建并推送至远程仓库

docker buildx build --platform linux/amd64,linux/arm64 -t swr.cn-east-3.myhuaweicloud.com/china/apline-test:v1 --push . --builder datarc-builder --provenance=false --sbom=false
查看远程仓库已经推送成功 查看有两种架构
image-20250425110951014 image-20250425110849996

本地测试

docker run -it --rm --name test_container swr.cn-east-3.myhuaweicloud.com/china/apline-test:v1

X86 效果 arm 效果
image-20250425112843234 image-20250425140710839

通过镜像名区分平台

amd64 架构构建镜像

docker buildx build --platform linux/amd64 -t swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-amd64 --load --builder datarc-builder .  --provenance=false  --sbom=false

arm64 架构构建镜像:

docker buildx build --platform linux/arm64 -t swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-arm64 --load --builder datarc-builder .  --provenance=false  --sbom=false

推送到仓库:

docker push swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-amd64
docker push swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-arm64

创建 manifest:

https://docs.docker.com/reference/cli/docker/manifest/

docker manifest create swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2 swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-amd64 swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-arm64 --amend

推送 manifest

docker manifest push swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2
查看远程仓库已经推送成功 查看有两种架构
image-20250425134928737 image-20250425134949905
docker pull swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2
docker images |grep v2
docker inspect --format='{{.Architecture}}' swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2
docker run -it --rm  --name test_container swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2
X86 效果 arm 效果
image-20250425135318868 image-20250425140528485

查看镜像信息

docker buildx imagetools inspect [docker images name:tag]

https://github.com/docker/buildx/issues/59

https://github.com/docker/buildx/issues/59#issuecomment-2612971318