[英]subprocess.popen and subprocess.run when calling another file.py gives import error on linux. Python 3.6.4
[英]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
你應該:
FROM
圖像 在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.