【问题标题】:Docker Image built on Mac OSX won't run on AWS EC2 instance在 Mac OSX 上构建的 Docker 映像无法在 AWS EC2 实例上运行
【发布时间】:2021-05-02 16:11:17
【问题描述】:

基于 Mac OSX 和 M1 处理器构建的映像,部署到 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

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

docker run container/name python test.py

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

【问题讨论】:

    标签: macos docker amazon-ec2 apple-m1 apple-silicon


    【解决方案1】:

    我不确定您为什么会收到此错误,但如果您愿意并且不介意您的代码和图像是公开的,那么有一个很好的方法可以绕过它。我猜这无论如何都只是家常便饭,所以可能还不错。

    1. 将您的代码放入 github。
    2. 在 hub.docker.com 为您的图像配置自动构建 github
    3. ssh 到您的 ec2 实例并直接拉取您的图像 来自码头中心

    另一种方法是从步骤 1 开始,然后使用 ssh 登录到您的 ec2 并在该机器上克隆 repo。然后,您可以直接在真正的 linux 机器上构建它(您的 osx 机器不运行 Linux,这与 docker 即时不匹配)。如果你在服务器上构建它,你应该可以毫无问题地在那里运行它。

    【讨论】:

    • 这是为了将客户端工作转移到 Docker 的测试路径,因此公共镜像并不是一个真正的选择。一些图像将被容器化并存储到一组服务器上,因此在每台服务器上构建图像也不适用于这种情况。尽管如此,从 github 了解自动构建很有趣,而且可能在其他地方。非常感谢您引起我的注意。
    • 顺便说一句,您也可以使用私人存储库——您不必将它们向公众开放。如果您使用多个服务器,这是您需要遵循的标准模式。这是迄今为止所有选项中最简单的。您甚至可以通过更受限制的注册表运行,例如亚马逊自己的 ECR。归根结底,如果您要为一组服务器执行此操作,您也应该使用 kubernetes - 这很难,但这是让所有服务器协同工作并支持服务器集群的最简单方法。
    【解决方案2】:

    尝试在容器中使用CMD ["lscpu"] 或类似cat /proc/cpuinfo 的相关内容运行,比较架构

    另外一件事:你可能会在构建时拉取arm 架构的python 映像,并尝试在x86_64 (EC2) 上运行它

    【讨论】:

    • docker image inspect | grep Architecture 也提供此信息,无需将代码注入图像。不过你是对的,它是关于使用错误的架构提取图像,你的回答激发了我深入挖掘并深入了解这一点。
    【解决方案3】:

    好的。这是正在发生的事情。我的 Mac 有新的 M1 芯片,我正在运行 Tech Preview version of 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 实例上运行没有问题(或警告)。

    【讨论】:

    猜你喜欢
    • 2021-05-23
    • 2021-02-20
    • 2019-03-15
    • 2015-03-18
    • 2017-12-17
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多