可以在Windows上的Docker中运行ARM / rpi映像,但不能运行linux

时间:2016-09-17 20:46:45

标签: linux docker raspberry-pi arm

我可以在Windows(64位)的Docker中运行ARM映像(例如,hypriot / rpi-node),但是在我尝试的所有linux x86 / 64机器上(Debian,CoreOS,Alpine等)我得到以下错误 - 这对我来说很有意义,但我不知道为什么它会在Windows上运行Docker然后,我想知道我是否错过了使用x86机器作为ARM映像的构建服务器的一些机会(即。在谷歌/ aws云/天蓝色)。我有什么想法可以吗?

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

6 个答案:

答案 0 :(得分:2)

用于Windows的Docker(以及用于mac的docker)都使用linux vm来托管容器。但是,他们使用的linux vm与你的Linux机器之间的区别在于,他们的VM有一个名为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' F' F' F' F' F' F'在更多的地方(似乎确实有一个debian错误https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=868030

答案 1 :(得分:0)

在Windows和Mac上,docker可在Linux VM下运行。所以,我认为,对于Windows下的容器启动了ARM Linux VM。但在本机Linux下使用本机架构。

答案 2 :(得分:0)

" exec格式错误"确认您没有在正确的架构上运行docker镜像。 尝试在Raspberry Pi 2上运行x86 docker镜像时遇到此错误(适用于ARM体系结构)。我很确定当你以相反的方式做错时可能会出现同样的错误。

因此,正如Kulti所说,Windows / MAC必须已经启动了ARM Linux VM。 如果您希望在Linux上使用ARM docker镜像,您可能需要尝试手动运行Linux docker VM。我认为你可以使用" docker-machine"甚至在linux上:Docker documentation for docker-machine。 (Haven自己也没做过,所以我不确定)

希望这有帮助。

答案 3 :(得分:0)

Windows上的Docker使用已配置的Linux VM,以便它可以通过Qemu用户模式仿真运行其他体系结构的映像。您可以用类似的方式配置本机linux,它也将运行ARM映像。有一个精心编写的三部分系列,详细介绍了这一切

要脱离Part#1的主要事情是Linux上的任何文件都是通过解释器执行的(甚至是二进制文件)。解释器的选择可以根据文件或文件扩展名开头的字节模式等通过binfmt_misc进行配置。

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

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

这里要注意的重要一点是,关于Docker实现或容器化没有什么特别的,它可以使Windows上的Docker能够执行ARM二进制文件。相反,可以将任何Linux设置(无论是在裸机上还是在容器中)配置为通过Qemu对ARM cpu的用户模式仿真来执行ARM二进制文件。

答案 4 :(得分:0)

我知道这篇文章很旧,但是我会在这里发布我的解决方案,以防有人通过Google来到这里。

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

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

您可以在此post上找到更多信息。

答案 5 :(得分:0)

您需要为qemu的cd /mnt/backups; mkdir test模块配置内核,并且容器需要在容器文件系统中具有qemu使用的静态二进制文件。

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

qemu-user-static

确保已加载内核模块(以根用户身份):

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

然后,在运行容器时,您可以将静态qemu二进制文件安装到容器中,而不是将其打包在映像中,例如对于手臂弓:

modprobe binfmt_misc

Docker在用于台式机的Docker上使用的嵌入式Linux VM中包括docker run -it --rm \ -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static:ro \ hypriot/rpi-node /bin/sh ,并且似乎还有一些其他功能可以避免需要在容器内部手动挂载静态qemu文件。