为什么我的docker-entrypoint.sh不执行?

Ami*_*ani 32 docker dockerfile

我的ENTRYPOINT脚本不执行并抛出 standard_init_linux.go:175: exec user process caused "no such file or directory".为什么这样?

不起作用

$ docker build -t gilani/trollo . && docker run gilani/trollo
Sending build context to Docker daemon   126 kB
Step 1 : FROM vault:latest
 ---> 1f127f53f8b5
Step 2 : MAINTAINER Amin Shah Gilani <gilani@payload.tech>
 ---> Using cache
 ---> 86b885ca1c81
Step 3 : COPY vaultConfig.json /vault/config
 ---> Using cache
 ---> 1a2be2fa3acd
Step 4 : COPY ./docker-entrypoint.sh /
 ---> Using cache
 ---> 0eb7c1c992f1
Step 5 : RUN chmod +x /docker-entrypoint.sh
 ---> Running in 251395c4790f
 ---> 46aa0fbc9637
Removing intermediate container 251395c4790f
Step 6 : ENTRYPOINT /docker-entrypoint.sh
 ---> Running in 7434f052178f
 ---> eca040859bfe
Removing intermediate container 7434f052178f
Successfully built eca040859bfe
standard_init_linux.go:175: exec user process caused "no such file or directory"
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM vault:latest

MAINTAINER Amin Shah Gilani <gilani@payload.tech>

COPY vaultConfig.json /vault/config

COPY ./docker-entrypoint.sh /

RUN chmod +x /docker-entrypoint.sh

ENTRYPOINT ["/docker-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

docker-entrypoint.sh:

#!/bin/bash

echo 'Hello World!'
Run Code Online (Sandbox Code Playgroud)

作品

$ docker build -t gilani/trollo . && docker run gilani/trollo
Sending build context to Docker daemon   126 kB
Step 1 : FROM vault:latest
 ---> 1f127f53f8b5
Step 2 : MAINTAINER Amin Shah Gilani <gilani@payload.tech>
 ---> Using cache
 ---> 86b885ca1c81
Step 3 : COPY vaultConfig.json /vault/config
 ---> Using cache
 ---> 1a2be2fa3acd
Step 4 : ENTRYPOINT echo 'hello world'
 ---> Using cache
 ---> ef5792a1f252
Successfully built ef5792a1f252
'hello world'
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM vault:latest

MAINTAINER Amin Shah Gilani <gilani@payload.tech>

COPY vaultConfig.json /vault/config

ENTRYPOINT ["echo", "'hello world'"]
Run Code Online (Sandbox Code Playgroud)

Dan*_*ard 63

我正在用一个非常类似的问题撕掉我的头发.在我的情况下/ bin/bash存在DID.但实际上问题是windows line endings.

在我的例子中,git存储库有一个带有Unix行结尾的入口点脚本(\n).但是当在Windows机器上检出存储库时,git决定尝试并且聪明并用windows行结尾替换文件中的行结尾(\ r \n).

这意味着shebang没有工作,因为它没有寻找/ bin/bash它正在寻找/ bin/bash\r \n

我的解决方案是禁用git的自动转换:git config --global core.autocrlf input然后再次检出存储库并重建

这里有一些更有用的信息: 如何更改行结束设置 ,这里 http://willi.am/blog/2016/08/11/docker-for-windows-dealing-with-windows-line-endings/

  • 非常感谢你,因为同样的问题,我也一直在撕扯我的头发. (2认同)

P.J*_*sch 33

vault:latest图像不包含/bin/bash您尝试使用shebang调用的图像#!/bin/bash.您应该将其更改为#!/bin/sh或从脚本中完全删除shebang.

  • 在我的情况下,删除 `#!/bin/bash` 没有帮助,实际上丢失它会导致同样的问题。对我来说正确的解决方案是@daniel-howard 提供的解决方案。 (2认同)

Rya*_*len 12

另一种可能:

检查文件是否没有使用 Windows 行尾 (CRLF) 保存。如果是,用 Unix 行尾 (LF) 保存它,它会被找到。

  • 这是一个与这个答案相配合的命令。dos2unix 是用于更改多个文件的行结尾的 Linux 命令。 (2认同)

BMi*_*tch 8

没有看到你的形象,我最初的想法是你的图像中没有/ bin/bash.将docker-entrypoint.sh的第一行更改为:

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

很可能会解决它.

  • 这在使用基于 Alpine 的图像时尤其重要,其中默认 shell 不称为“bash”而是“ash”。 (2认同)

小智 6

天啊我挣扎了2-3个小时!!感谢@Ryan Allen 对于我的情况,这是 CRLF 问题。我正在通过 ATOM 为詹金斯设置处理傀儡清单。确保如果您在 Windows 上使用 ATOM 或任何其他 IDE,当您将文件(尤其是 .sh)传输到 unix 时,请将其转换为 unix 格式。一旦转换,它就像魔术一样起作用。这是我在木偶文件中添加的内容:

  exec {'dos2unix':
    path      => ['/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/opt/puppetlabs/bin'],
    command   => 'dos2unix /dockerwork/puppet/jenkins/files/*',
    subscribe => File['/dockerwork/puppet/jenkins/files/init.sh'],
  }
Run Code Online (Sandbox Code Playgroud)


Ada*_*Cox 6

我在尝试构建 Dockerfile“入口点”( entrypoint.sh) bash shell 脚本(在 .NET Core SDK 2.2 映像中执行)时遇到了类似的问题。脚本的开头有一行#!/bin/bash,并且在执行期间docker-compose up(成功构建后docker-compose build,日志记录报告为web_1 | ./entrypoint.sh: line 1: #!/bin/bash: No such file or directory.

使用 VS Code 检查文件,我注意到它报告了以下编码:

带 BOM 的 UTF-8

在此输入图像描述

单击此按钮,我将获得以下选项Save with encoding

在此输入图像描述

我选择保存为UTF-8(utf8),这解决了问题。

注意:我还发现了这篇文章What's the Difference between UTF-8 and UTF-8 without BOM?


Dan*_*atz 5

我挣扎了几个小时,因为我没有注意到任何地方都解释说您需要将文件复制到 VM 可以访问文件的位置,最好是全局的,如下所示:

COPY docker-entrypoint.sh /usr/local/bin/
Run Code Online (Sandbox Code Playgroud)

(我原以为它应该是自动访问的,因为它是 dockerfile 上下文的一部分)