我的 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\nQEMU 是一个免费的开源虚拟机管理程序。它通过动态二进制翻译来模拟machine\xe2\x80\x99s处理器,并为机器提供一组不同的硬件和设备模型,使其能够运行各种客户操作系统。
\n
设置 QEMU 有多种方法,例如,在 GitHub 管道中运行时,您可以使用 GitHub 操作setup-qemu-action
\n假设您使用的是基于 ubuntu 的系统,首先检查您的 docker 驱动程序支持哪些平台。
\ndocker buildx ls\nNAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS\ndefault * docker \n default default running linux/amd64, linux/386\nRun Code Online (Sandbox Code Playgroud)\n现在安装qemu。
\nsudo 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\nRun Code Online (Sandbox Code Playgroud)\n现在我们增加了对arm64架构的支持。
\nphusion/passenger-ruby27存储库通过标签分隔基于 arm64 的映像(截至 2022 年 11 月)。
假设您想要在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)
| 归档时间: |
|
| 查看次数: |
28018 次 |
| 最近记录: |