[英]Why won't my docker-entrypoint.sh execute?
我的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"]
码头入口点.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'"]
我正在用与此非常相似的问题撕掉我的头发。 在我的情况下 /bin/bash 确实存在。 但实际上问题是 Windows 行尾。
就我而言,git 存储库有一个带有 Unix 行结尾 (\\n) 的入口点脚本。 但是,当在 Windows 机器上检出存储库时,git 决定尝试聪明一点,用 Windows 行结尾 (\\r\\n) 替换文件中的行结尾。
这意味着 shebang 不起作用,因为它不是在寻找/bin/bash
,而是在寻找/bin/bash\\r
。
我的解决方案是禁用 git 的自动转换:
git config --global core.autocrlf input
然后再次检出存储库并重建。
这里有一些更有用的信息: 如何更改行尾设置和这里http://willi.am/blog/2016/08/11/docker-for-windows-dealing-with-windows-line-endings/
在vault:latest
图像不包含/bin/bash
,你尝试用你的家当拨打#!/bin/bash
。 您应该将其更改为#!/bin/sh
或从脚本中完全删除 shebang。
在没有看到您的图像的情况下,我最初的想法是您的图像中没有 /bin/bash。 将 docker-entrypoint.sh 的第一行更改为:
#!/bin/sh
可能会解决它。
另一种可能:
检查文件是否没有使用 Windows 行尾 (CRLF) 保存。 如果是,用 Unix 行尾 (LF) 保存它,它会被找到。
我挣扎了几个小时,因为我没有注意到任何地方都解释说您需要将文件复制到 VM 可以访问文件的位置,最好像这样全局复制:
COPY docker-entrypoint.sh /usr/local/bin/
(我原以为它应该是自动访问的,因为它是 dockerfile 上下文的一部分)
天哪,我挣扎了 2-3 个小时!! 感谢@Ryan Allen 对于我的情况,这是 CRLF 问题。 我正在通过 ATOM 为 jenkins 设置处理木偶清单。 确保您在 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'],
}
在解决我尝试构建 Dockerfile“入口点”( entrypoint.sh
)bash shell 脚本(将在 .NET Core SDK 2.2 映像中执行)的尝试时,我遇到了类似的问题。 脚本的开头有一行#!/bin/bash
,并且在执行docker-compose up
(使用web_1 | ./entrypoint.sh: line 1: #!/bin/bash: No such file or directory
docker-compose build
成功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),解决了这个问题。
注意:我还发现了这篇 SO 文章没有 BOM 的 UTF-8 和 UTF-8 有什么区别?
出现此错误的另一个原因是您的 Windows 用户密码更改。
在我的情况下,我的 entrypoint.sh 行结尾是 LF 但我仍然收到错误消息。 我们的管理员每个月左右都会强制重置密码。 每当发生这种情况时,我都会遇到错误。 如果这是您的原因,您可能需要在“共享驱动器”下的 docker 设置中重置您的凭据。
取消选择驱动器并应用。 然后重新选择驱动器并应用。 它会提示您输入密码。
我的情况是我使用的 alpine 映像根本没有 bash ...... RUN apk-install bash
显然做到了
这个问题与行尾有关,我用下面的解决方案解决了它
将 DOS 文件转换为 unix 格式。 这将删除任何有线线路结尾。
dos2unix - 在 alpine 和其他 Linux 发行版中可用。
我是这样使用的: RUN apk add dos2unix && dos2unix /entry.sh
抱歉黑客攻击 - 这不是对问题的回答,而是对不同问题的描述,它是具有相同症状的解决方案。
我有
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\"}" \
]
没有一个解决方案对我有用,但我能够通过将 WORKDIR 设置为包含入口点脚本的同一目录来解决错误。 没有多少cd
会起作用,但 WORKDIR 以某种方式解决了它
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.