如何修复“ exec用户进程未导致此类文件或目录”

时间:2019-04-05 01:34:52

标签: docker

我试图在我的Dockerfile中使用tini,但出现错误。

我使用了tini自述文件中的代码示例。

# ... code which builds /app/foo

# Add Tini
ENV TINI_VERSION v0.18.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]

# Run the program when the container starts
CMD ["/app/foo"]

我希望我的程序在没有PID=1的情况下运行,但我却得到:standard_init_linux.go:207: exec user process caused "no such file or directory"

编辑:

/app/foo在Dockerfile的开头创建。 /app/foo没有问题。作为证明,如果我注释掉ENTRYPOINT行(或删除所有与tini相关的代码),则我的/app/foo运行正常,除了它有PID=1

3 个答案:

答案 0 :(得分:2)

正如David所提到的,您需要检查正在下载的内容。如果您在Alpine图片中手动运行此代码,则会看到确切的问题:

$ docker run -it --rm alpine /bin/sh
/ # apk add file
...
/ # apk add curl
...
/ # curl -sSL https://github.com/krallin/tini/releases/download/v0.18.0/tini >tini
/ # chmod 755 tini
/ # file tini
tini: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=38c262787814dc459678c8f24710bbde944b7e56, stripped
/ # ldd tini
        /lib64/ld-linux-x86-64.so.2 (0x7f1beab2a000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f1beab2a000)
Error relocating tini: __fprintf_chk: symbol not found
/ # ./tini
/bin/sh: ./tini: not found
/ # ls -al /lib64/ld-linux-x86-64.so.2
ls: /lib64/ld-linux-x86-64.so.2: No such file or directory

请注意动态链接的部分,以及它正在寻找libc的事实。 Alpine方案中的错误告诉您libc不存在。您还会看到带有刮擦图像的图片。

您将要获得完全静态编译的tini版本,或切换到安装了libc的系统。对于前者,使用tini,就像下载其他URL一样容易:

ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini

答案 1 :(得分:2)

另一个原因:文件末尾的行不正确。 Linux需要LF,如果您的主机是Windows,则要运行的脚本将包含CRLF

答案 2 :(得分:0)

导致上述问题的另一个原因可能是调用了使用不可用Shell的脚本。例如,当脚本的第一行是

#!/bin/bash

然后这需要系统上的bash。将系统的bash更改为默认的sh(ell)可以解决。因此,替换为

#!/bin/sh