我有一个根据基本映像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
安装了缺少的库,然后可以运行二进制文件。
答案 0 :(得分:2)
对于二进制文件,这很可能表示缺少动态库。您可以运行ldd /usr/local/bin/my_bin
来查看二进制文件使用的所有库。对于alpine,外部编译程序中最缺少的常见库是libc。 Alpine是用musl而不是libc构建的,因此,您将需要专门为Alpine编译程序。
对于其他可能在docker容器中遇到此错误的人,我在faq presentation和other questions on the {{3} }。
答案 1 :(得分:0)
/ # my_bin init
/bin/sh: my_bin: not found
在上一行执行时,提示找不到您要执行的文件, my_bin 是您的情况下的文件。
检查文件是否正确复制并具有相同的名称,或者您可能正在尝试从其他位置执行文件。
例如如果在执行/usr/local/bin/my_bin init
命令后没有执行cd /usr/local/bin
,请尝试ls -l /usr/local/bin/my_bin
。