Docker exec /bin/sh: exec format error on Arm64

问题描述 投票:0回答:2

我的 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

Dockerfile 看起来像这样

FROM phusion/passenger-ruby27
ENV HOME /root
RUN apt-get update

码头工人-v

Docker version 20.10.17, build 100c701

uname -a

Linux Ubuntu SMP Thu Jun 9 13:06:11 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux

lsb_release -a

Ubuntu 20.04.4 LTS
docker arm64
2个回答
1
投票

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

2.3.12.3.1-arm64

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

Docker文件:

ARG BASE_TAG
FROM phusion/passenger-ruby27:$BASE_TAG
ENV HOME /root
RUN apt-get update

构建示例:

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

# on amd
$ docker build --build-arg BASE_TAG=2.3.1 .

1
投票

您可能需要使用

docker buildx
或安装 QEMU 或两者都需要。

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

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

假设你在基于ubuntu的系统上,首先检查你的docker驱动支持哪些平台。

docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS  PLATFORMS
default * docker                  
 default default         running linux/amd64, linux/386

现在安装 qemu.

sudo apt-get install -y qemu qemu-user-static

docker buildx ls
NAME/NODE    DRIVER/ENDPOINT             STATUS  PLATFORMS
default      docker                              
  default    default                     running linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6

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

© www.soinside.com 2019 - 2024. All rights reserved.