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

时间:2020-06-12 16:58:06

标签: linux docker containers

我有一个根据基本映像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安装了缺少的库,然后可以运行二进制文件。

2 个答案:

答案 0 :(得分:2)

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

对于其他可能在docker容器中遇到此错误的人,我在faq presentationother 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