在 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
不存在。
我正在做一些非常简单的事情。这是我的 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
不存在。