Образ 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, что приводит к ошибке «not found».
В дополнение к динамическому загрузчику, ваш код имеет несколько дополнительных зависимостей от общей библиотеки:
$ 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
.