在 Mac OSX 上构建的 Docker 映像不会在 AWS EC2 实例上运行

pet*_*les 5 macos amazon-ec2 docker apple-silicon apple-m1

使用 M1 处理器在 Mac OSX 上构建的映像,部署到 EC2 实例。但是当脚本运行时,它会产生错误:

standard_init_linux.go:219: exec user process caused: exec format error

在 Stackoverflow 的其他地方,这被解释为操作系统架构不匹配。果然在 EC2 实例上运行“uname -m”显示它是 x86_64,“docker image inspect”显示容器具有架构 arm64。

这是我不明白的地方。我的 Mac 上的“uname -m”也显示为 x86_64。那么容器如何继承不同的架构呢?

更重要的是,如何在我的 Mac 上构建可以在 EC2 上运行的映像?

Docker 文件很简单

FROM python
WORKDIR /
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY src /src
Run Code Online (Sandbox Code Playgroud)

src 目前包含一些简单的 python 脚本,执行如下:

docker run container/name python test.py

这在我的 Mac 上运行良好,但在 AWS 上执行时会出现上述错误。

pet*_*les 23

好的。这就是发生的事情。我的 Mac 配备了新的 M1 芯片,并且正在运行Docker Desktop 的技术预览版。在引擎盖下,芯片具有arm64架构,但通过iTerm和VSCode询问它,它声称是x86_64,因此当我发布问题时我很困惑。这可能是因为这两个应用程序都在幕后通过英特尔模拟器悄悄运行,这就是对 uname 命令的响应。

然而,因为处理器实际上是arm64,所以当我从Docker中提取Python图像时,这就是基本架构(我尝试了很多不同风格和版本的Python - 所有这些都具有相同的结果)。

为了强制使用与 amd64 AWS 兼容的映像,我将 Dockerfile 的第一行更改为:

FROM --platform=linux/x86-64 python

当此映像中的容器在 Mac 上运行时会导致警告

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

但仅此而已,出现警告,然后脚本运行(可能是通过英特尔模拟器重定向回来)。现在,脚本在 EC2 实例上运行时没有问题(或警告)。

  • 您还可以使用“buildx”强制为不同平台构建镜像https://www.docker.com/blog/multi-platform-docker-builds/ (3认同)