docker - 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,或者为什么它在我的情况下不起作用但对其他人正确。
有没有其他人遇到过这个错误?
解决方案
没有深入的技术细节,这个错误意味着内核无法识别可执行文件的格式,因此无法运行该文件。在您的情况下,此错误与启动容器时启动的可执行文件有关。根据Cmd
输出中的条目docker inspect marcelstoer/nodemcu-build
,它是一个文件/bin/sh
,它是一个ELF可执行文件。
当Linux无法执行ELF二进制并返回这样的错误(关于文件格式)时,通常与系统架构有关。更具体地说,该映像marcelstoer/nodemcu-build
包含ELF64
可执行文件(即用于amd64
体系结构),而您的系统不支持它(是它i386
还是某种形式的arm
?)。但是, Runningdocker run hello-world
对您来说效果很好,因为hello-world
Docker 支持的所有架构都存在映像。
根据镜像的Dockerfile,marcelstoer/nodemcu-build
它是从 构建的ubuntu
,它存在于不同的架构中,因此,您可以尝试marcelstoer/nodemcu-build
在您的系统上构建镜像,而不是从 dockerhub 中拉取它。
PS:关于您与您的问题相关联的解决方案。这与您的情况无关(ELF 二进制文件),而是与脚本有关。在脚本的情况下,可执行格式由#!
文件开头的 shebang ( ) 识别,因此,脚本必须以 开头#!
,而不是换行符。这就是为什么作者得到了同样的错误:内核无法检测到这是一个脚本并且无法启动它。不同(但相似)的原因,相同的错误。
推荐阅读
- unit-testing - 如何模拟 Autofac IComponentContext.Resolve
- c# - 当玩家和敌人有一定距离并且敌人是预制件时,如何激活敌人?
- custom-component - 应用 VCL 样式时,根据属性在运行时更改按钮颜色
- javascript - How to populate object with findById? CastError: Cast to ObjectId failed for value
- java - 如何将 int [] 数组转换为 java.sql.Array
- mysql - 如何循环遍历 mysql 查询的结果?
- python - 使用 BeautifulSoup 4 从许多页面中获取多个元素
- eclipse - Maven 依赖项:无法解析导入,但存在于本地存储库中(Eclipse Oomph 解压缩设置任务)
- .net - Visual Studio Preview 19 中的 Xamarin IOS 说 IOS Designer 即将消失,但没有关于如何使用 Xcode 的链接
- yaml - 在 GitHub 操作中使用日期作为 ENV 变量