我正在从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"]
答案 0 :(得分:0)
总结起来,您的解决方案的工作原理尚不完全清楚,但是假设您迭代/executables
并将其推送到__CallCommand
,则如果您的可执行文件无法在Alpine上运行,在CentOS上构建(链接)。
我能够构建和运行代码的副本,但使用Alpine的(busybox)可执行文件,并且不尝试复制二进制文件。然后,我复制了本地发行版的echo
,这失败了(如预期的那样)< / p>
您可能希望尝试运行已复制到容器上的可执行文件:
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库(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
的链接
答案 1 :(得分:0)
感谢@DazWilkin! 容器中的交互式外壳极大地帮助了!
第一个可执行文件是JRE文件,我的容器没有Java(想知道我在想什么:)在没有Java的情况下运行它)。将Java和Python添加到Centos容器中,我现在可以运行它。