可以在Windows上运行ARM/rpi镜像,但不能在linux上运行



我能够运行ARM图像(例如:hypriot/rpi-node)在Windows上的Docker(64位),但在所有linux x86/64机器我尝试过(Debian, CoreOS, Alpine等)我得到以下错误-这对我有意义,但我不明白为什么它会在Windows上运行Docker然后,我想知道我是否错过了一些机会使用x86机器作为ARM映像的构建服务器(即。在谷歌/aws云/azure)。你知道我该怎么做吗?

docker run -ti hypriot/rpi-node ls
standard_init_linux.go:175: exec user process caused "exec format error"

Docker for windows(和Docker for mac)都使用linux虚拟机来承载容器。然而,他们使用的linux虚拟机和你的linux机器之间的区别在于,他们的虚拟机有一个名为binfmt_misc的内核系统,当它遇到外国体系结构的二进制文件时,它会调用qemu (https://github.com/linuxkit/linuxkit/blob/1c552f7a9db7f0660d3c83362d241e54142323ca/pkg/binfmt/etc/binfmt.d/00_linuxkit.conf)

如果您要适当地配置您的linux机器,它可以用作ARM映像的构建服务器。Google qemu-user-static获取一些关于如何设置它的想法。

注意,linuxkit vm使用'F'标志,这在配置典型的linux环境时似乎不是标准的。如果没有它,您需要将qemu二进制文件放入容器中。我不知道为什么在更多的地方使用'F'不是标准的做法(似乎有一个debian的bug这样做https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=868030)

在Windows和Mac上docker在Linux VM下工作。所以,我认为,你的容器在Windows下启动ARM Linux VM。但是在本机Linux下使用本机架构。

"exec格式错误"确认您没有在正确的架构上运行docker映像。我在Raspberry Pi 2(使用ARM架构)上运行x86 docker映像时遇到了这个错误。我敢肯定,如果你反过来做,可能会出现同样的错误

所以,正如Kulti所说,Windows/MAC必须启动一个ARM Linux虚拟机。如果您希望在Linux上使用ARM docker映像,您可能需要尝试手动运行Linux docker虚拟机。我认为你甚至可以在linux上使用"Docker -machine"来完成它:Docker -machine的Docker文档。(我自己没有做过,所以我不确定)

Windows上的Docker使用一个Linux虚拟机,该虚拟机已经配置为可以通过Qemu用户模式仿真运行其他架构的映像。您可以以类似的方式配置本机linux,然后它也将运行ARM映像。有一个写得很好的三部分系列,详细描述了这一切

从第1部分中得出的主要结论是,Linux上的任何文件都是通过解释器执行的(即使是二进制文件)。解释器的选择是可配置的,通过binfmt_misc,基于文件开头的字节模式或文件扩展名等。

第2部分建立在第1部分的基础上,展示如何配置Linux内核(安装在任何体系结构上)来使用Qemu User Emulation解释ARM二进制文件。

最后,第3部分展示了如何将相同的技巧应用到docker容器中的linux设置中,这意味着linux docker容器(可以用于任何体系结构)将能够执行ARM二进制文件。

这里需要注意的重要一点是,docker实现或容器化并没有什么特别之处,它允许Windows上的docker能够执行ARM二进制文件。相反,任何Linux设置(无论是在裸机上还是在容器中)都可以配置为通过Qemu的用户模式模拟ARM cpu来执行ARM二进制文件。

我知道这篇文章很老了,但我还是会把我的解决方案贴在这里,以防有人通过谷歌来这里。

发生这种情况是因为您的Docker主机无法运行AMR架构的映像。要在Docker中启用此功能,只需运行:

docker run --rm --privileged hypriot/qemu-register

你可以在这篇文章中找到更多信息

您需要为qemu的binfmt_misc模块配置内核,并且容器需要在容器文件系统中提供qemu使用的静态二进制文件。

您可以用hyperiot/qemu-register映像加载主机上的文件,但是我更喜欢可用的发行版供应商包(确保我在更新时获得补丁)。对于Debian,重要的软件包是qemu-user-static,您可以使用以下命令以root身份安装:

apt-get update && apt-get install qemu-user-static

确保内核模块被加载(作为root):

modprobe binfmt_misc

当运行容器时,你可以将静态的qemu二进制文件挂载到你的容器中,而不是将它们打包到你的映像中,例如,对于arm arch:

docker run -it --rm 
  -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static:ro 
  hypriot/rpi-node /bin/sh

Docker在Docker for Desktop上使用的嵌入式Linux VM中包含了binfmt_misc,并且似乎有一些额外的功能来避免需要手动挂载容器中的静态qemu文件。

最新更新