在 docker 容器中找不到文件

Der*_*ang 8 docker docker-container

我正在做一些非常简单的事情。这是我的Dockerfile

FROM alpine:latest

ADD hello.sh /bin/hello
RUN chmod +x /bin/hello

CMD /bin/hello
Run Code Online (Sandbox Code Playgroud)

然后我构建图像:

docker build -t hello .
Run Code Online (Sandbox Code Playgroud)

然后我运行图像:

docker run hello
Run Code Online (Sandbox Code Playgroud)

这是输出:

/bin/sh: /bin/hello: not found
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?如果我运行:

docker run hello cat /bin/hello
Run Code Online (Sandbox Code Playgroud)

我可以看到我的脚本内容,这让我更加困惑。

小智 12

就我而言,问题是脚本的行结尾Windows编码而不是Linux. (注意:这实际上是由git自动转换它们引起的,我禁用了它们)

脚本的第一行提供 shell 的文件路径。由于\rWindows EOL 中包含的额外内容,系统尝试将该隐藏字符附加到文件名,这就是导致错误的原因Not Found


Geo*_*off 7

这听起来像是您试图执行一个bash脚本,但 alpine 默认情况下不包含bash. 相反,您需要通过sh将 shebang 行更改为 来执行脚本#!/bin/sh

实际上,脚本正在执行,但实际上是说脚本/bin/bash不存在。


Der*_*ang 6

通过使用 ubuntu 映像而不是 alpine 映像解决了问题。不完全确定原因,但可能与文件的用户/权限位被复制且未正确解释有关。


BMi*_*tch 6

未找到的文件可能来自:

  • 该文件实际上不存在,请检查拼写错误,确保您在只应该运行命令时没有尝试一起运行带引号的命令和所有参数(不是这个问题,但已经见过很多次了)。并确保您没有将卷安装在您期望命令的位置之上。
  • 脚本顶部的命令不存在。例如,当容器只有 sh 时尝试调用 bash。这也适用于在 Windows 上创建脚本并在命令末尾具有无效换行符的脚本。我不相信 Alpine 包含像其他基础镜像那样的 bash。
  • 您尝试运行的二进制文件链接容器内不存在的库。这可以从 Alpine 与 musl libc 版本的差异中看出。