我有一个从基本映像构建的容器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
。