Docker exec /bin/sh:Arm64 上的 exec 格式错误

red*_*vil 16 docker arm64

我的 Dockerfile 在 x86 机器上工作,但在具有架构的机器上失败arm64;特别是在a1.2xlarge(一个aws EC2-instance)上。

运行时出错docker compose up -d

#0 0.462 exec /bin/sh: exec format error
------
failed to solve: executor failed running [/bin/sh -c apt-get update]: exit code: 1
Run Code Online (Sandbox Code Playgroud)

Dockerfile 看起来像这样

FROM phusion/passenger-ruby27
ENV HOME /root
RUN apt-get update
Run Code Online (Sandbox Code Playgroud)

docker-v

Docker version 20.10.17, build 100c701
Run Code Online (Sandbox Code Playgroud)

uname -a

Linux Ubuntu SMP Thu Jun 9 13:06:11 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

lsb_release -a

Ubuntu 20.04.4 LTS
Run Code Online (Sandbox Code Playgroud)

gin*_*boy 18

您可能需要使用docker buildx或安装QEMU,或者可能两者都需要。

\n
\n

QEMU 是一个免费的开源虚拟机管理程序。它通过动态二进制翻译来模拟machine\xe2\x80\x99s处理器,并为机器提供一组不同的硬件和设备模型,使其能够运行各种客户操作系统。

\n
\n

设置 QEMU 有多种方法,例如,在 GitHub 管道中运行时,您可以使用 GitHub 操作setup-qemu-action

\n

假设您使用的是基于 ubuntu 的系统,首先检查您的 docker 驱动程序支持哪些平台。

\n
docker buildx ls\nNAME/NODE DRIVER/ENDPOINT STATUS  PLATFORMS\ndefault * docker                  \n default default         running linux/amd64, linux/386\n
Run Code Online (Sandbox Code Playgroud)\n

现在安装qemu。

\n
sudo apt-get install -y qemu qemu-user-static\n\ndocker buildx ls\nNAME/NODE    DRIVER/ENDPOINT             STATUS  PLATFORMS\ndefault      docker                              \n  default    default                     running linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6\n
Run Code Online (Sandbox Code Playgroud)\n

现在我们增加了对arm64架构的支持。

\n

  • 这为我解决了这个问题,干得好,谢谢@gingerbreadboy! (2认同)

Mik*_*e D 2

phusion/passenger-ruby27存储库通过标签分隔基于 arm64 的映像(截至 2022 年 11 月)。

2.3.12.3.1-arm64

假设您想要在arm64实例上构建arm64映像,解决此问题的一个简单方法是将标签作为构建参数传递。

Dockerfile:

ARG BASE_TAG
FROM phusion/passenger-ruby27:$BASE_TAG
ENV HOME /root
RUN apt-get update
Run Code Online (Sandbox Code Playgroud)

构建示例:

# on arm
$ docker build --build-arg BASE_TAG=2.3.1-arm64 .

# on amd
$ docker build --build-arg BASE_TAG=2.3.1 .
Run Code Online (Sandbox Code Playgroud)