核心是构建并推送符合OCI标准的Manifest List,由Docker客户端自动按架构选型拉取;需仓库支持(如Docker Hub、ECR、Harbor≥2.0)、本地启用实验性功能,并推荐用docker buildx一键构建推送。

要让一个镜像标签(比如 myapp:latest)在不同 CPU 架构(如 linux/amd64、linux/arm64)上都能自动适配运行,核心是构建并推送一个符合 OCI v1.0+ 标准的 Manifest List。这不是简单打多个 tag,而是生成一个“镜像索引”,由 Docker 客户端根据本地环境自动选型拉取。
确认仓库与客户端支持
不是所有镜像仓库都原生支持 Manifest List:
- Docker Hub、GitHub Container Registry(GHCR)、Amazon ECR、Harbor ≥ 2.0、Quay.io 均已支持 OCI Image Index
- 私有 Harbor 需启用
content_trust并配置为 OCI 模式 - 自建 registry(如 distribution)需开启
compatibility_schema2和 OCI 支持 - 本地 Docker 需启用实验性功能:在
~/.docker/config.json中添加"experimental": "enabled" - 用
docker buildx imagetools inspect nginx:latest测试能否解析远程清单,验证连通性
推荐方式:用 buildx 一键构建并推送
这是最稳定、适合 CI/CD 的生产方案,buildx 会自动完成跨平台构建、上传、清单生成和推送,无需手动聚合。
- 启用 QEMU 模拟支持:
docker run --privileged multiarch/qemu-user-static --reset -p yes - 创建并启动多架构构建器:
docker buildx create --use --name mybuilder && docker buildx inspect --bootstrap - 执行构建+推送(例如 amd64 + arm64):
docker buildx build \<br> --platform linux/amd64,linux/arm64 \<br> --push \<br> -t your-registry.com/ns/app:v1.0 .
- 推送完成后,
app:v1.0在仓库中即为 Manifest List,含两个平台对应镜像摘要
备选方式:用 docker manifest 手动聚合已有镜像
适用于已有分别构建好的单架构镜像(如 app:v1.0-amd64、app:v1.0-arm64),再合并成统一标签。
- 确保已启用实验性功能(同上)
- 先将各平台镜像推送到仓库,并打上明确 tag
- 创建清单:
docker manifest create your-registry.com/ns/app:v1.0 \<br> your-registry.com/ns/app:v1.0-amd64 \<br> your-registry.com/ns/app:v1.0-arm64
- 如某镜像缺少平台元数据,用 annotate 补全:
docker manifest annotate your-registry.com/ns/app:v1.0 \<br> your-registry.com/ns/app:v1.0-arm64 \<br> --arch arm64 --os linux
- 最后推送清单:
docker manifest push your-registry.com/ns/app:v1.0
验证是否生效
别跳过这步,否则上线才发现拉错架构就晚了:
- 查看清单结构:
docker manifest inspect your-registry.com/ns/app:v1.0,确认输出中包含多个platform字段 - 在 amd64 机器上执行
docker pull your-registry.com/ns/app:v1.0,检查日志是否拉取linux/amd64层 - 在 arm64 机器(如树莓派或 M 系列 Mac)同样拉取,确认匹配
linux/arm64 - 可加
--verbose或用docker image inspect查看实际拉取的 digest 是否与清单中对应平台一致











