簡體   English   中英

為什么我不能執行復制到容器中的二進制文件?

[英]Why can't I execute binary copied into a container?

我有一個從基本圖像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 ,這里是 output

# 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的 output 和更多谷歌搜索,我發現運行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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM