我的 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
phusion/passenger-ruby27 存储库通过标签分隔基于 arm64 的图像(截至 2022 年 11 月)。
即2.3.1 和 2.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 .
您可能需要使用
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 架构的支持。