Docker Centos,无法执行二进制文件

时间:2019-04-04 02:46:03

标签: c++ docker centos raspberry-pi3

我有一个C++ binary,它在本地centos上运行良好。最近,我开始学习docker,并尝试在C++上运行我的centos docker应用程序。

首先,我从泊坞枢纽中提取了centos:latest,并在其上安装了C++应用程序,该应用程序成功运行,没有任何问题。现在我在raspberry-pi上安装了docker并再次拉了centos并尝试在其上运行相同的应用程序,但它给了我错误。

  

bash:无法执行二进制文件

通常,当我们尝试在不同的体系结构上运行应用程序时会出现此错误。我在raspberry-pi上检查了cat etc/centos-release,结果是CentOS Linux release 7.6.1810 (AltArch),其中本地centos的结果是CentOS Linux release 7.6.1810 (Core)

两种设备上的

uname -a如下

raspberry-pi,centos docker Linux c475f349e7c2 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l armv7l armv7l GNU/Linux

centos,centos docker Linux a57f3fc2c1a6 4.15.0-46-generic #49-Ubuntu SMP Wed Feb 6 09:33:07 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

编辑: 另外,file myapplication

TTCHAIN: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.24, BuildID[sha1]=287b501c8206893f7819f215ee0033586212b143, with debug_info, not stripped

我的问题是我如何运行在raspberry-pi模型3上从docker提取的centos相同的本机应用程序。

3 个答案:

答案 0 :(得分:1)

您的应用程序已针对x86-64构建。英特尔x86-64二进制文件无法在ARM处理器上运行。

您有两种追求的途径:

  1. 如果没有该应用程序的源代码,则需要一个可在Raspberry Pi上运行的x86-64仿真器。考虑到Pi的功能较少,以及Intel起诉任何为其处理器创建仿真器的人的倾向性,我怀疑您会发现它是公开可用的。

  2. 如果您具有应用程序的源代码,则需要将其重建为Raspberry Pi可执行文件。您似乎知道它是用C ++编写的。 Raspberry Pi提供了GCC和其他工具链(最有可能在Pi上使用“ yum install gcc”来为您抓取编译器和工具)。构建应用程序应该与为x86_64构建应用程序极为相似。

可以找到一个交叉编译器,该编译器可以让您从x86_64盒中为Pi进行构建,但这会变得很复杂。

答案 1 :(得分:0)

可能是您正在尝试在32位处理器上运行64位二进制文​​件,但是肯定需要更多信息才能知道。

您可以在外壳程序中使用file命令进行检查。您可能需要使用-m32标志将原始系统重新编译为gcc。

答案 2 :(得分:0)

请在两个设备上都输入“ uname -a”,然后发布结果。

最有可能处理器或库类型不匹配。

我想(希望)您不是要在Pi上运行x86编译的应用程序。尽管Docker可用于两种处理器类型,但Docker不会在Pi上运行x86二进制文件,反之亦然。

实际上,AltArch当前表示以下体系结构之一... ppc64,ppc64le,i386,armhfp(ARM v7 32位),aarch64(arm v8 64位)。 Core建议使用CentOS的主流x86和x86_64版本。

是的,我敢打赌这就是事实……您不能只将x86二进制文件传输到Raspbian并期望它能工作。必须为平台重建该应用程序。