如何在x86_64主机上的arm64 Docker映像中运行Erlang

ncgqoxb0  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(423)

我的Docker容器如何在我的x86_64/amd64主机上以linux/arm64/v8平台运行Erlang命令?我正在尝试在the official documentation之后构建多平台Docker映像。当以Erlang运行构建步骤时,我的构建失败。根据此构建失败找出根本原因:在x86_64主机上模拟arm64时,Erlang命令返回segmentation fault,即使arm/v7工作正常.
我已经在两台机器上进行了测试:我已经测试了qemu版本6.2.07.0.0-28,它们在tonistiigi/binfmt上使用各自的标签来安装模拟器。
在任一x86_64主机上重现的步骤(假设已安装Docker):

$ docker run --privileged --rm tonistiigi/binfmt --install all
{
  "supported": [
    "linux/amd64",
    "linux/arm64",
    "linux/riscv64",
    "linux/ppc64le",
    "linux/s390x",
    "linux/386",
    "linux/mips64le",
    "linux/mips64",
    "linux/arm/v7",
    "linux/arm/v6"
  ],
  "emulators": [
    "qemu-aarch64",
    "qemu-arm",
    "qemu-mips64",
    "qemu-mips64el",
    "qemu-ppc64le",
    "qemu-riscv64",
    "qemu-s390x"
  ]
}

$ docker run --rm -it --platform linux/arm64 erlang:latest /bin/bash
root@d7f9b846f13a:/# uname -m
aarch64
root@d7f9b846f13a:/# erl
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault

$ docker inspect erlang:latest --format '{{.Os}}/{{.Architecture}}/{{.Variant}}'
linux/arm64/v8

在上面,平台linux/arm64linux/arm64/v8的别名。运行erl失败,并出现分段错误。我希望它的工作方式与linux/arm/v7相同,linux/arm/v7能够启动erl会话,如下所示。

$ docker run --rm -it --platform linux/arm/v7 erlang:latest /bin/bash
root@5a786052f0e4:/# uname -m
armv7l
root@5a786052f0e4:/# erl
Erlang/OTP 25 [erts-13.1.1] [source] [32-bit] [smp:2:2] [ds:2:2:10] [async-threads:1]

Eshell V13.1.1  (abort with ^G)
1>

$ docker inspect erlang:latest --format '{{.Os}}/{{.Architecture}}/{{.Variant}}'
linux/arm/v7

我的docker容器如何在我的x86_64/amd64主机上的linux/arm64/v8平台上运行Erlang命令?

hsgswve4

hsgswve41#

由于qemu中的一个bug/缺失特性,erlang JIT在运行时会出现segfaults。因此,您需要编译不带JIT的erlang,或者使用不带JIT的旧版本的erlang。
有关更多详细信息,请参见https://github.com/erlang/otp/pull/6340

相关问题