我的Docker容器如何在我的x86_64
/amd64
主机上以linux/arm64/v8
平台运行Erlang命令?我正在尝试在the official documentation之后构建多平台Docker映像。当以Erlang运行构建步骤时,我的构建失败。根据此构建失败找出根本原因:在x86_64
主机上模拟arm64
时,Erlang命令返回segmentation fault
,即使arm/v7
工作正常.
我已经在两台机器上进行了测试:我已经测试了qemu版本6.2.0
和7.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/arm64
是linux/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命令?
1条答案
按热度按时间hsgswve41#
由于qemu中的一个bug/缺失特性,erlang JIT在运行时会出现segfaults。因此,您需要编译不带JIT的erlang,或者使用不带JIT的旧版本的erlang。
有关更多详细信息,请参见https://github.com/erlang/otp/pull/6340。