首页 > 解决方案 > Docker 中的 NodeMCU 构建导致“执行格式错误”

问题描述

我第一次尝试在 Ubuntu 16.04.4 LTS 中构建 NodeMCU Docker。我已经阅读了 Docker 和 NodeMCU 的标记文章,但没有看到这个特定的错误。

“docker run hello-world”没有问题。

我已经尝试过两种形式的 NodeMCU 构建命令:

$ docker run --rm -ti -v `pwd`:/opt/nodemcu-firmware marcelstoer/nodemcu-build

和显式路径变化:

$ docker run --rm -it -v /home/tim/nodemcu-firmware:/opt/nodemcu-firmware marcelstoer/nodemcu-build

在这两种情况下,我都会收到此错误:

standard_init_linux.go:187: exec user process caused "exec format error"

我已经搜索过这个错误,大多数解决方案都与丢失的 shebang 有关。

但是,我不确定哪个脚本需要 shebang,或者为什么它在我的情况下不起作用但对其他人正确。
有没有其他人遇到过这个错误?

标签: dockernodemcu

解决方案


没有深入的技术细节,这个错误意味着内核无法识别可执行文件的格式,因此无法运行该文件。在您的情况下,此错误与启动容器时启动的可执行文件有关。根据Cmd输出中的条目docker inspect marcelstoer/nodemcu-build,它是一个文件/bin/sh,它是一个ELF可执行文件。

当Linux无法执行ELF二进制并返回这样的错误(关于文件格式)时,通常与系统架构有关。更具体地说,该映像marcelstoer/nodemcu-build包含ELF64可执行文件(即用于amd64体系结构),而您的系统不支持它(是它i386还是某种形式的arm?)。但是, Runningdocker run hello-world对您来说效果很好,因为hello-worldDocker 支持的所有架构都存在映像。

根据镜像的Dockerfilemarcelstoer/nodemcu-build它是从 构建的ubuntu,它存在于不同的架构中,因此,您可以尝试marcelstoer/nodemcu-build在您的系统上构建镜像,而不是从 dockerhub 中拉取它。

PS:关于您与您的问题相关联的解决方案。这与您的情况无关(ELF 二进制文件),而是与脚本有关。在脚本的情况下,可执行格式由#!文件开头的 shebang ( ) 识别,因此,脚本必须以 开头#!,而不是换行符。这就是为什么作者得到了同样的错误:内核无法检测到这是一个脚本并且无法启动它。不同(但相似)的原因,相同的错误。


推荐阅读