如何构建一个可以在busybox中运行我的c ++程序的docker构建文件?

问题描述 投票:1回答:1

我正在尝试在嵌入式世界中玩和学习docker的用法。我正在使用busybox docker镜像作为开始,我正在尝试将我的C ++程序二进制文件复制到docker容器上。但是,我发现我无法在忙框中执行二进制文件。我不确定我错过了什么。忙箱子码头使用是这样的吗?

这是我到目前为止所尝试的内容 -

Dockerfile

FROM busybox:1.30
COPY ./test4.out /home/
CMD  /home/test4.out

现在,这是我的c ++代码。

#include <iostream>

using namespace std;

int main()
{

  return 120;
}

我在我的主机上编译了这段代码 -

#gcc test4.cpp  -o test4.out

建立我的码头工人

docker build -t abc/busybox-smarter:1.0 .

docker build -t abc/busybox-smarter:1.0 .
Sending build context to Docker daemon  12.29kB
Step 1/3 : FROM busybox:1.30
 ---> af2f74c517aa
Step 2/3 : COPY ./test4.out /home/
 ---> Using cache
 ---> 1d6fe02933c1
Step 3/3 : CMD  /home/test4.out
 ---> Using cache
 ---> dd590ef4059d
Successfully built dd590ef4059d
Successfully tagged abc/busybox-smarter:1.0

现在,我正在运行此图像。

docker run --rm -ti abc/busybox-smarter:1.0 /bin/sh

/home # ./test4.out 
/bin/sh: ./test4.out: not found
docker dockerfile
1个回答
1
投票

busybox图像包含一个静态编译的二进制文件的最小集合(其中大部分实际上只是busybox的硬链接)。另一方面,gcc命令的输出是动态链接的可执行文件:

$ g++ -o test4.out test4.cpp
$ file test4.out
test4.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=9c3a99f3baa5f699f4e32fa65acc58ac8ddc099c, not stripped

为了执行,它需要适当的动态加载器(通常类似于/lib64/ld-linux-x86-64.so.2)。

这在busybox图像中不存在,这会导致“未找到”错误。

除了动态加载器之外,您的代码还有一些额外的共享库依赖项:

$ ldd prog
        linux-vdso.so.1 (0x00007fff01dbb000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f566279e000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f566240a000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f56621f2000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f5661e34000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f5662b30000)

您需要在映像中提供所有可用的共享库,以便运行代码。

您可以尝试静态编译代码。您首先需要安排在系统上安装任何所需库的静态版本。在我的Fedora 28环境中,这意味着我首先必须运行:

yum -y install libstdc++-static glibc-static

然后我能够生成二进制的静态版本:

$ g++ --static -o test4.out test4.cpp
$ file test4.out
test4.out: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=d0f3b446020e1b067ededb59ec491bff9634f550, not stripped

我可以在busybox容器中运行此图像没有问题。

警告!有些函数(通常是处理主机名解析和用户/组的函数)在运行时需要动态共享库,即使使用--static编译也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.