Docker镜像在Ubuntu运行报错:exec /usr/local/openjdk-11/bin/java: exec format error
解决Docker镜像跨平台运行的exec格式错误问题
你遇到的这个问题根源很明确:你拉取的mademustafa/postmage:latest镜像只构建了linux/arm64/v8平台版本,而你的Ubuntu 20.04是linux/amd64(x86_64)架构,两者不兼容,导致镜像里的arm64版本Java二进制文件无法在amd64系统上执行,直接触发了exec /usr/local/openjdk-11/bin/java: exec format error这个报错。
快速临时解决方案
直接在拉取或运行镜像时指定匹配Ubuntu的平台架构即可:
- 拉取时指定平台:
docker pull --platform linux/amd64 mademustafa/postmage:latest - 或者跳过重新拉取,直接在运行时指定平台:
docker run -it --platform linux/amd64 mademustafa/postmage:latest
不过这个方案生效的前提是,该镜像的Docker Hub仓库里已经存在linux/amd64版本的镜像。如果仓库里没有,你需要构建多平台镜像来彻底解决问题。
长期彻底解决方案:构建多平台镜像
如果这个镜像是你自己维护的,推荐用Docker Buildx构建支持多架构的镜像,这样不管是arm64架构的MacBook还是amd64架构的Ubuntu都能正常运行:
- 先启用Docker Buildx工具:
docker buildx create --use - 构建并推送多平台镜像到Docker Hub(需要你拥有该镜像仓库的推送权限):
docker buildx build --platform linux/amd64,linux/arm64/v8 -t mademustafa/postmage:latest --push .
这样构建出来的镜像会同时包含amd64和arm64版本,Docker会自动根据宿主机架构拉取匹配的版本,后续就不会再出现平台不匹配的问题了。
补充一句:你的MacBook能正常运行是因为M系列芯片属于arm64架构,和镜像的平台完全匹配,自然没有兼容性问题。
内容的提问来源于stack exchange,提问作者Mustafa Maden
相关产品推荐
相关产品推荐

