我的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'"]
答案 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
点击此按钮,我将获得Save with encoding
的选项:
我选择另存为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\"}" \
]