在docker容器中找不到文件

时间:2016-03-15 02:48:25

标签: docker 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

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

5 个答案:

答案 0 :(得分:1)

在我的情况下,问题是脚本的行尾Windows而不是Linux编码的。 (注意:这实际上是由于git自动将其转换(我禁用了)引起的)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我遇到过类似的问题,无论我的python应用程序如何简单(想象一下hello.py输出'hello world'),当通过docker-compose build&& up命令我收到错误hello.py - 找不到。 原来,问题是virtualbox没有正确挂载我的文件夹(app)。这是一次救援,并在5分钟内解决了我的问题: Docker + Ubuntu + Virtualbox: "volumes" directive in dockerfile not working

答案 3 :(得分:0)

找不到的文件可以来自:

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

答案 4 :(得分:0)

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

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