在苹果M系列芯片上构建Docker镜像后,在k8s上无法运行的问题解决方案

问题描述

最近在一台新的Mac Air上构建了Docker镜像,上传到镜像仓库后在k8s上启动服务时出现以下报错:

1
standard_init_linux.go:228: exec user process caused: exec format error

问题原因

在苹果M系列芯片上构建Docker镜像时,Docker会自动将所需的二进制文件编译为适用于arm64架构的格式,因此生成的镜像只能在arm64平台上运行。如果尝试在x86_64平台上运行此镜像,由于架构不匹配,就会导致失败。

同样地,在x86_64平台上构建的镜像只能在x86_64平台上运行,因为二进制文件已经被编译为适用于x86_64架构的格式,无法在其他架构的处理器上运行。

解决方案

使用–platform参数可以指定镜像构建所针对的平台。如果不指定该参数,那么默认情况下会针对当前机器的平台进行构建。在跨平台构建时,使用该参数可以指定镜像构建所针对的目标平台,从而确保生成的镜像可以在指定平台上运行。

例如,如果你想要在x86_64平台上构建ARM64架构的镜像,可以使用以下命令:

1
docker build --platform=linux/arm64 .

其中,–platform=linux/arm64参数表示构建针对ARM64架构的镜像,.表示Dockerfile所在目录。

需要注意的是,该参数只在Docker Engine 19.03及以上版本中支持。在早期版本中,可能需要使用其他方式进行跨平台构建。