问题出现得很突然,日志倒是留得挺全。Ubuntu 22.04 的 x86 机器装 Docker 24.0,docker pull nginx 正常,换成私有仓库里的 app:v4 报 no matching manifest for linux/amd64 in the manifest list entries,同一个 tag 在 M1 笔记本上可以正常拉。

刚开始盯着「CI 的 runner 本身是 arm64,默认平台跟着变了」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。推送时只打了 arm64,manifest list 里没有 amd64 条目。还有一种是buildx 构建后没有加 --push,镜像只留在本地缓存。

少数情况下是用 docker tag 覆盖了多架构 tag,清单被替换成单架构。

第一件事是看 manifest list 里有哪些平台

docker manifest inspect registry.local/app:v4

接着在 amd64 机器上补构建并推送

docker buildx build --platform linux/amd64 -t registry.local/app:v4 --push .

一次构建多平台清单

docker buildx build --platform linux/amd64,linux/arm64 -t registry.local/app:v4 --push .

拉取时显式指定平台验证

docker pull --platform linux/amd64 registry.local/app:v4

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

改完先别撤,确认这几项。manifest inspect 里同时有 amd64 和 arm64 两条,两台机器分别 pull 都能成功,容器启动正常。

容易忽略的是,用 docker tag 给多架构镜像打新 tag 会退化成单架构,重新打标签要用 buildx imagetools create。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189