基于MacOSX的Docker镜像赢得';t在AWS EC2实例上运行

基于MacOSX的Docker镜像赢得';t在AWS EC2实例上运行,macos,docker,amazon-ec2,apple-m1,apple-silicon,Macos,Docker,Amazon Ec2,Apple M1,Apple Silicon,映像构建在Mac OSX上,带有M1处理器,部署到EC2实例。但在运行脚本时,会产生以下错误: standard_init_linux.go:219:exec用户进程导致:exec格式错误 在Stackoverflow的其他地方,这被解释为操作系统架构的不匹配。确实,在EC2实例上运行“uname-m”表明它是x86_64,而“docker image inspect”表明容器具有arm64体系结构 这是我不明白的。我的Mac上的“uname-m”也显示了x86_64。那么,容器如何继承不同的体

映像构建在Mac OSX上,带有M1处理器,部署到EC2实例。但在运行脚本时,会产生以下错误:

standard_init_linux.go:219:exec用户进程导致:exec格式错误

在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运行容器/name python test.py


这在我的Mac电脑上运行正常,但在AWS上执行时会出现上述错误。

我不知道为什么会出现此错误,但如果您愿意并且不介意代码和图像公开,有一种很好的方法可以避免此错误。我猜这只是家里的东西,所以可能不会太糟糕

  • 将代码放在github中
  • 在上配置存储库 为您的映像配置hub.docker.com,并从 github
  • ssh到您的ec2实例上,并直接拉取您的映像 来自docker hub

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

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


    另一件事:在构建python映像时,您可能正在拉动python映像的架构,并尝试在
    x86_64
    (EC2)

    上运行它。下面是正在发生的事情。我的Mac电脑有新的M1芯片,我正在运行。在引擎盖下,芯片具有arm64架构,但通过iTerm和VSCode查询它时,它声称是x86_64,因此我在发布问题时感到困惑。这可能是因为这两个应用程序都在幕后通过英特尔模拟器悄悄运行,而这正是对uname命令的响应

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

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

    FROM--platform=linux/x86-64 python

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

    警告:请求的映像的平台(linux/amd64)与检测到的主机平台(linux/arm64/v8)不匹配,并且未请求特定的平台


    但它只是一个警告,脚本运行(大概是通过重定向回英特尔模拟器。脚本现在运行没有问题(或警告)在EC2实例上。

    这是一个测试路径,旨在将客户端工作转移到Docker,因此公共映像不是一个真正的选项。一些映像将被容器化,并购买到一组服务器上,因此在每台服务器上构建映像也不适用于这种情况。不过,了解g的自动构建ithub很有趣,可能在其他地方。非常感谢你让我注意到这一点。顺便说一句,你也可以使用私人回购——你不必让它们对公众开放。如果你使用多个服务器,这是你想要遵循的标准模式。这是所有选项中最简单的。你甚至可以运行更多的restricted registry,例如亚马逊自己的ECR。最终,如果你要为一组服务器执行此操作,你也应该使用kubernetes——这很难,但这是让所有服务器协同工作并支持一组服务器的最简单方法。
    docker image inspect | grep Architecture
    也提供了此信息,而无需将代码注入到图像中。你是对的,这是关于用错误的体系结构提取图像,你的回答启发我更深入地了解这一点。我必须记住这一点-这在将来肯定会越来越多地出现,回答很好!你也可以使用
    buildx
    强制为不同的平台构建图像rms