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

Docker “如何修复”;exec用户进程未导致此类文件或目录“;,docker,Docker,我试图在Dockerfile中使用tini,但出现了一个错误 我使用了tinireadme文件中的代码示例 # ... 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", "--"]

我试图在Dockerfile中使用
tini
,但出现了一个错误

我使用了
tini
readme文件中的代码示例

# ... 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\u init\u linux.go:207:exec用户进程导致“没有这样的文件或目录”

编辑:


/app/foo
在Dockerfile的开头创建。
/app/foo
没有问题。为了证明这一点,如果我注释掉
ENTRYPOINT
行(或者删除所有
tini
相关代码),我的
/app/foo
运行良好,除了David提到的它有
PID=1

,您需要检查下载的内容。如果在阿尔卑斯山图像中手动运行此操作,您将看到确切的问题:

$ 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的事实。阿尔卑斯山场景中的错误是告诉您libc不存在。你还会看到一个划痕图像

您需要获取完全静态编译的tini版本,或者切换到安装了libc的系统。对于前者,使用tini,只需下载不同的URL即可:

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

另一个原因可能是调用的脚本的第一行指向不可用的shell。 例如,当脚本的第一行(也称为shebang)为

那么这就需要在系统上安装
bash
。将系统的
bash
更改为默认的
sh(ell)
,这可能是一个解决方案。所以,用

#!/bin/sh
#!/usr/bin/env bash
或者,在某些系统上,bash不在
/bin
中,而是在
/usr/bin/env
中。所以,用

#!/bin/sh
#!/usr/bin/env bash


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

错误的体系结构;下载的东西实际上是一个tar文件或HTML页面;缺少共享库(特别是在没有libc的
scratch
映像上运行时)。。。您在哪里创建了/app/foo?@BMitch,/app/foo在Dockerfile的开头创建。我编辑这个问题是为了澄清。@JoelFan在这种情况下,生成/app/foo的过程是不正确的。无法真正调试注释。发布
docker exec sh-c'ls/app的结果