Saki's 研究记录

Docker Error standard_init_linux.go exec user process caused exec formaterror

字数统计: 352阅读时长: 1 min
2022/05/08

背景

最近写了些python脚本打算把它们都扔到Docker里面去跑。写完Dockerfile测试好,push上服务器运行时报错了。

1
2
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested
standard_init_linux.go:228: exec user process caused: exec format error

原因

看到提示突然想起来:我现在用的是M1 MacBookTMD 的默认 build 出来的镜像是 linux/arm64/v8 架构的呀!
好在 M1 Mac 上的 Docker Tech Preview 也支持使用 buildx 构建多架构的镜像,稍微设置一下就可以了。

题外话,M1 MacBook Pro 真的很好用,建议早买早享受

解决

Docker 默认的 builder 命令不支持跨平台构建任务,我们需要使用 buildx 插件。

1
docker buildx build --platform linux/amd64 -t m1_builder:v1 .

–platform 参数就是要构建的目标平台,这里我就选了服务器用的 linux/amd64。最后的 .(构建路径)注意不要忘了加。

buildxdocker build 命令的使用方式基本一样,还支持 build 常用的选项如 -t-f 等。其中 platform 就是支持的架构,跨平台构建的底层是用 QEMU 实现的。

构建完 push 上服务器去后,就能正常运行啦~

参考

How to build x86 (and others!) Docker images on an M1 Mac
How to Actually Deploy Docker Images Built on M1 Macs With Apple Silicon
使用 buildx 构建多种系统架构支持的 Docker 镜像

以上。

CATALOG
  1. 1. 背景
  2. 2. 原因
  3. 3. 解决
  4. 4. 参考