在 docker 容器中找不到文件

File not found in docker container

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

FROM alpine:latest

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

CMD /bin/hello

然后我构建图像:

docker build -t hello .

然后我运行图片:

docker run hello

这是输出:

/bin/sh: /bin/hello: not found

为什么会这样?如果我 运行:

docker run hello cat /bin/hello

能看到我脚本的内容,这让我更加迷茫了。

使用 ubuntu 图像而不是高山图像解决了问题。不确定原因,但可能与文件的 user/permission 位被复制并且未正确解释有关。

我遇到过类似的问题,无论我的 python 应用程序多么简单(想象一下 hello.py 输出 'hello world'),当 运行 通过 docker-compose build && up 命令我收到错误 hello.py - 未找到。 事实证明,问题是 virtualbox 没有正确挂载我的文件夹(应用程序)。这是一种救援,并在 5 分钟内解决了我的问题:

找不到的文件可能来自:

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

在我的例子中,问题是脚本 的 line-endings 是 Windows 编码而不是 Linux。 (注意:这实际上是git自动转换它们造成的,我禁用了)

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

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

来使用 sh 执行脚本

实际上,脚本正在执行,但它实际上表示 /bin/bash 不存在。