簡體   English   中英

Subprocess.Popen在Docker容器中運行時給出“沒有這樣的文件”

[英]Subprocess.Popen gives “No such file” when run inside Docker container

我正在從docker容器內運行python應用程序。 該應用程序是一個腳本,使用子進程順序調用一組可執行文件。

當我在我的Centos機器上測試它時,腳本運行正常,但是當在docker容器內調用調用可執行文件的子進程時,失敗並顯示“找不到文件”(大概是可執行文件)

我已經嘗試過使用Python 2.7和Centos7作為基本容器,但問題仍然存在。

給出錯誤的python代碼是:

def __CallCommand(self, program, command):
        """ Allows execution of a simple command. """
        out = ""
        err = ""
        p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out,err = p.communicate()

錯誤是:OSError:[Errno 2]沒有這樣的文件或目錄

這是我的dockerfile

FROM python:2.7-alpine


RUN mkdir -p /input
RUN mkdir -p /output
RUN mkdir -p /executables

COPY config.yml        .
COPY executables       /executables
COPY pipeline.py       .
COPY input             /input

ENTRYPOINT ["python", "pipeline.py", "-i", "/input/inputFile.txt", "-o", "output"]

您並不完全清楚自己的解決方案是如何工作的,但假設您遍歷/executables並將這些/executables推送到__CallCommand ,如果在CentOS上構建(鏈接),則可執行文件可能無法在Alpine上運行。

我能夠構建和運行你的代碼的repro,但使用Alpine的(busybox)可執行文件,而不是嘗試復制二進制文件。然后我復制了我的本地發行版的echo ,這失敗了(正如預期的那樣)

您可能希望嘗試運行您在容器上復制的可執行文件:

docker run --interactive --tty --entrypoint ash [[your-image]]`
/ # cd executables/
/executables # ls -l
total 32
-rw-r--r--    1 root     root             0 Apr  1 23:13 1
-rw-r--r--    1 root     root             0 Apr  1 23:13 2
-rwxr-xr-x    1 root     root         31464 Apr  1 23:38 echo
/executables # ldd echo
        /lib64/ld-linux-x86-64.so.2 (0x7f405d498000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f405d498000)
Error relocating echo: __printf_chk: symbol not found
Error relocating echo: error: symbol not found
Error relocating echo: __fprintf_chk: symbol not found
/executables # ./echo Hello
ash: ./echo: not found

你應該:

  • 使用非Alpine FROM圖像
  • 為Alpine建立二進制文件
  • 在Alpine上安裝glibc

其他細節

在Alpine(使用其native | busybox) echo命令:

ldd /bin/echo
        /lib/ld-musl-x86_64.so.1 (0x7ff4f8848000)
        libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7ff4f8848000)

你可以看到' musl`被使用(Alpine使用這個版本的libc)

我的本地主機有Debian,它使用GNU C Library( glibc ):

ldd /bin/echo
        linux-vdso.so.1 (0x00007ffc88ff6000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6933af1000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6934098000)

你可以看到libc.so鏈接到gnu/libc

謝謝@DazWilkin! 進入容器的交互式shell幫助極大!

第一個可執行文件是一個JRE文件,我的容器沒有java(想知道我在想什么:)沒有Java運行它。 將Java和Python添加到Centos容器中,我現在可以運行它。

暫無
暫無

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

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