为什么我无法执行复制到容器中的二进制文件?



我有一个从基本映像构建的容器alpine:3.11

现在我有一个二进制my_bin,我将其复制到正在运行的容器中。从正在运行的容器中,我移动到/usr/local/bin,并确认二进制文件具有正确的权限。例如

/ # ls -l /usr/local/bin/my_bin
-rwxr-xr-x    1 root     root      55662376 Jun 12 18:52 /usr/local/bin/my_bin

但是当我尝试执行/运行此二进制文件时,我得到以下内容:

/ # my_bin init
/bin/sh: my_bin: not found

如果我切换到/usr/local/bin/并通过./my_bin运行,情况也是如此

另外,如果我尝试使用完整路径

/# /usr/local/bin/my_bin init
/bin/sh: /usr/local/bin/my_bin: not found

为什么我会看到这种行为?我如何能够执行二进制文件?

编辑 1我安装了file,我还可以确认二进制文件已被复制并且是可执行文件

file /usr/local/bin/my_bin 
/usr/local/bin/my_bin: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=b36f0aad307c3229850d8db8c52e00033eae900c, for GNU/Linux 3.2.0, not stripped

也许这提供了一些额外的线索?

编辑 2

正如@BMitch在答案中建议的那样,我也运行了ldd,这是输出

# ldd /usr/local/bin/my_bin 
/lib64/ld-linux-x86-64.so.2 (0x7f91a79f3000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f91a79f3000)
libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f91a79f3000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f91a79f3000)

**编辑 3 **

根据ldd和更多谷歌搜索的输出,我发现运行apk add libc6-compat安装了缺少的库,然后我可以运行二进制文件。

对于二进制文件,这很可能表示缺少动态库。您可以运行ldd /usr/local/bin/my_bin以查看二进制文件使用的所有库。对于 alpine,外部编译程序中缺少的最常见的库是 libc。Alpine 是用 musl 而不是 libc 构建的,因此您需要专门为 Alpine 编译程序。

对于可能在 docker 容器中遇到此错误的其他人,我在常见问题解答演示文稿和网站上的其他问题中介绍了各种问题。

/ # my_bin init
/bin/sh: my_bin: not found

当您在上面执行时,它说找不到您尝试执行的文件,my_bin是您情况下的文件。

检查文件是否已正确复制并具有相同的名称,或者您可能正在尝试从其他位置执行文件。

例如,如果您在ls -l /usr/local/bin/my_bin命令后没有执行cd /usr/local/bin,请尝试/usr/local/bin/my_bin init

最新更新