docker buildx create --use --name multi
docker buildx build --platform linux/arm64 -t app:1 .
docker image inspect app:1.0 -f '{{.Architecture}}'

在 amd64 机器上构建的镜像推到 arm 服务器,容器起来立刻退出,日志只有 `exec /app: exec format error`,同一个镜像本地跑完全正常,改成目标平台后正常。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,构建时没有指定目标平台,buildx 默认按本机架构出包,二进制和运行节点对不上,内核加载器读到文件头就拒绝执行,不写平台就默认本机。

「跨架构镜像构建」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

处理上按这个顺序:先 inspect 一下镜像的 Architecture 字段 确认是不是本机架构 再看节点架构是多少;用 buildx 带上 --platform 参数 按目标机器的架构重新构建一次镜像 不要复用旧层;推送的时候带上多架构清单 别只推单平台那一份镜像。

改完只确认一件事:arm 节点上容器正常启动,inspect 的 Architecture 显示 arm64,业务接口能正常返回数据,不再报格式错误。

作者 9823189