Subprocess.Popen在Docker容器中运行时给出“没有这样的文件”

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (80)

我正在从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并将这些推送到您的解决方案,__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建立二进制文件
  • 在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

扫码关注云+社区

领取腾讯云代金券