这是架构错配错误:M1/M2 Mac(aarch64)运行了amd64镜像,或Dockerfile中FROM未指定--platform导致基础镜像架构不匹配,需检查uname -m与docker inspect镜像Architecture是否一致。

docker run 报 standard_init_linux.go:219: exec user process caused: exec format error
这是 Docker Desktop(尤其是 macOS M1/M2 或 Windows on ARM)上最典型的架构错配错误。根本原因不是镜像坏了,而是你拉的镜像架构和本地 CPU 不一致——比如在 Apple Silicon Mac 上运行了 amd64 镜像,内核直接拒绝加载。
验证方式很简单:
- 查宿主机:运行
uname -m,M1/M2 返回aarch64,Intel Mac 返回x86_64 - 查镜像:运行
docker inspect nginx:latest | grep Architecture,看输出是amd64还是arm64
如果两者不一致,就必然触发这个错误。别折腾 chmod 或 ENTRYPOINT,那是南辕北辙。
docker build 时 FROM 镜像架构不匹配导致 exec format error
Dockerfile 的 FROM 指令决定了整个构建链的底层 ABI。如果你在 M1 Mac 上写 FROM ubuntu:22.04,Docker 默认拉的是 amd64 镜像(因为旧版 Docker Hub 索引优先返回 x86),后续所有 RUN apt update 命令都会失败——apt 二进制本身是 amd64 格式,无法在 aarch64 宿主上执行。
解决方法只有两个:
- 显式指定平台:
FROM --platform=linux/arm64 ubuntu:22.04 - 或改用已声明多架构支持的镜像名,如
FROM arm64v8/ubuntu:22.04(注意:部分旧镜像仓库已弃用该命名)
⚠️ 不要依赖 docker build --platform 覆盖全局——它只影响最终镜像声明,不改变构建阶段 RUN 所用的基础镜像架构。
docker exec 进容器后 bash 报 exec format error
这不是容器启动失败,而是你已经进到容器里,再执行某个命令(比如 bash、sh、./app)时出错。常见于以下情况:
- 容器是
scratch或alpine基础镜像,但你误拷贝了一个amd64的可执行文件进去 - 你在 Windows 上用 CRLF 保存脚本,又没加
#!/bin/sh,Linux 内核尝试把换行符当指令解析 - 脚本第一行写了
#!/usr/bin/env bash,但容器里压根没装bash(比如 Alpine 默认只有ash)
排查优先级:
- 先
file ./your-binary看输出是否含ELF 64-bit LSB pie executable, x86-64 - 再
ls -l /bin/确认目标解释器是否存在 - 最后用
dos2unix或 VS Code 换行符设置转成 LF
Mac M1 上用 docker buildx 构建跨平台镜像仍报错
buildx 只负责“构建”,不保证“运行”。即使你用 docker buildx build --platform linux/amd64,linux/arm64 成功推送到 registry,当你在本地 docker run 时,默认仍会拉取与宿主匹配的架构镜像(即 arm64)。如果你硬要跑 amd64 版本,必须显式加 --platform linux/amd64,且前提是已启用 QEMU 模拟:
- 检查是否注册成功:
cat /proc/sys/fs/binfmt_misc/qemu-x86_64应返回 enabled - 若无输出,运行:
docker run --rm --privileged tonistiigi/binfmt --install amd64 - 然后才能:
docker run --platform linux/amd64 nginx:latest
注意:QEMU 模拟仅适合开发调试。真实服务务必用原生架构镜像,否则性能折损超 50%,且 syscall 兼容性不可控。


















