繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM