← 中文资源

简体中文版本

Docker — 容器启动报 exec format error

诊断 arm64/amd64 镜像或二进制不匹配导致的 exec format error,核对平台摘要并构建多架构镜像。

阅读英文原文

内核说的是事实

exec format error 不是缺少依赖或权限问题。内核读取入口点后无法将其作为本机二进制执行。在 ARM 主机上,仅支持 amd64 的镜像会这样失败;在 amd64 主机上,arm64 镜像会这样失败。把在宿主机编译的二进制复制进 Linux 镜像但架构或操作系统不匹配时,也会出现同样错误。

uname -m
docker image inspect myapp:latest --format '{{.Os}}/{{.Architecture}}'

如果两个字符串不一致,停止调试应用,为目标平台重新构建。

构建多架构镜像

多架构镜像是一个索引,为每个平台指向一个镜像,仓库会为每台主机提供匹配的版本:

docker buildx create --use --name multiarch
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t registry.example.com/myapp:1.4.0 \
  --push .

构建必须真正支持两个平台。如果 Dockerfile 下载预编译二进制,要按 TARGETARCH 选择;如果编译,要使用交叉编译阶段。一个清单指向相同单架构层的“多架构”镜像比没有清单更糟,因为它看起来正确,直到运行时才暴露。

验证部署的摘要

标签可以被移动。推送后检查清单,并按摘要部署,使集群拿到你测试过的镜像。在 Kubernetes 中把摘要写入 Pod 规格,并确认节点架构与调度约束匹配。本地调试可以用 docker run --platform linux/amd64 强制指定镜像,但需要模拟,不是生产修复。

检查整条链

正确的基础镜像不能保证二进制正确。错误的 GOARCH 构建、在宿主机编译的 Node 原生插件,或复制的 CLI 工具,都可能产生该错误。检查入口点和所有原生依赖,而不只是基础镜像标签。