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

时间:2016-08-11 20:02:02

标签: 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"

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"]

docker-entrypoint.sh:

#!/bin/bash

echo 'Hello World!'

作品

$ 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'

Dockerfile:

FROM vault:latest

MAINTAINER Amin Shah Gilani <gilani@payload.tech>

COPY vaultConfig.json /vault/config

ENTRYPOINT ["echo", "'hello world'"]

11 个答案:

答案 0 :(得分:52)

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

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

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

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

这里有一些更有用的信息: How to change line-ending settings 和这里 http://willi.am/blog/2016/08/11/docker-for-windows-dealing-with-windows-line-endings/

答案 1 :(得分:26)

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

答案 2 :(得分:7)

如果没有看到您的图片,我最初的想法就是您没有/ bin / bash在您的图片中。将docker-entrypoint.sh的第一行更改为:

#!/bin/sh

可能会解决它。

答案 3 :(得分:4)

另一种可能性:

检查文件是否未使用Windows行结尾(CRLF)保存。如果是,用Unix行结尾(LF)保存它就可以找到它。

答案 4 :(得分:2)

我奋斗了几个小时,因为我没有发现任何地方解释您需要在VM可以访问文件的位置(最好是全局访问)复制文件:

COPY docker-entrypoint.sh /usr/local/bin/

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

答案 5 :(得分:1)

出现此错误的另一个原因是Windows用户密码更改。

在我的情况下,我的entrypoint.sh行结尾是LF,但我仍然得到错误。我们的管理员每个月左右都会重置一次强制密码。每当发生这种情况时,我都会遇到错误。如果这是您的原因,您可能需要在“共享驱动器”下的泊坞窗设置中重置凭据。

取消选择驱动器并应用。然后重新选择驱动器并应用。它会提示您输入密码。

答案 6 :(得分:1)

天哪,我挣扎了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'],
  }

答案 7 :(得分:1)

在进行故障排除时,我试图建立一个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

enter image description here

点击此按钮,我将获得Save with encoding的选项:

enter image description here

我选择另存为UTF-8(utf8),从而解决了该问题。

注意:我也找到了这篇What's the difference between UTF-8 and UTF-8 without BOM?

答案 8 :(得分:0)

我的情况是我使用的高山图像根本没有带有bash ... RUN apk-install bash明显做到了这个伎俩

答案 9 :(得分:0)

这个问题与行尾有关,我用下面的解决方案解决了

将DOS文件转换为unix格式。这将删除所有有线线路末端。

dos2unix -在高山以及其他Linux发行版中均可用。

我这样使用它:

运行apk添加dos2unix && dos2unix /entry.sh

答案 10 :(得分:0)

对不起,这不是对问题的回答,而是对另一个问题的描述,也是具有相同症状的解决方案。

我有

ENTRYPOINT ["/usr/bin/curl", "-X", "POST", "http://myservice:8000", \
              "-H", "Content-Type: application/json", \
              "-d", '{"id": "test"}' \
]

我遇到了错误:

/bin/bash: [/usr/bin/curl,: No such file or directory

原来是单引号弄乱了它。 Docker文档中有一条注释:

exec形式被解析为JSON数组,这意味着您必须在单词而非单引号(')周围使用双引号(“)。 引用

解决方案-使用双引号代替单引号,并转义嵌套的双引号:

ENTRYPOINT ["/usr/bin/curl", "-X", "POST", "http://myservice:8000", \
              "-H", "Content-Type: application/json", \
              "-d", "{\"id\": \"test\"}" \
]