Docker容器中找不到文件

8

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

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


我使用自己的Docker镜像复制了您上面的步骤,一切都很好,没有问题。因此,问题必须出在您所基于的Docker镜像上。该文件显然存在。这一定是一个权限问题。您应该检查默认情况下您是什么用户,您的权限等等。您能指向alpine来自哪个Dockerfile吗?我们可以提供更多具体信息。 - CtheGood
1
经过更多思考,我有另一个假设。 Docker镜像的入口可能会更改您的用户或干扰您的bash终端。尝试运行此命令 docker run -it hello bash,然后在容器内部运行hello(并发布输出)。这将告诉我们镜像的 entrypoint 和/或 CMD 是否正在执行某些奇怪的操作。您的第二个示例之所以能够工作是因为它专门覆盖了Dockerfile的CMD - CtheGood
嗨@CtheGood,感谢您关注这个问题。您的评论让我思考,并且我认为这可能是某种用户/组/权限问题。因此,我在ubuntu计算机上编写了脚本,并尝试在alpine镜像中运行它,这似乎是导致问题的原因。一旦我切换到ubuntu镜像,问题就消失了。 - Derek Chiang
5个回答

12
在我的情况下,问题是脚本的换行符使用了Windows编码而不是Linux。 (注:实际上是由于git自动转换导致的,我禁用了它)
脚本的第一行提供了shell文件路径。由于Windows EOL包含额外的\r,系统试图将该隐藏字符附加到文件名上,这就是导致未找到错误的原因。

7
这似乎是您试图执行一个 bash 脚本,但默认情况下alpine不包括bash。相反,您需要通过更改shebang行为#!/bin/sh来执行脚本。 实际上,脚本正在被执行,但它实际上是在说/bin/bash不存在。

最有可能的答案。此外,你可能可以使用 /bin/ash (Almquist Shell),但我还没有尝试过。 - Peter Kionga-Kamau

6

通过使用Ubuntu镜像而不是Alpine镜像解决了问题。 不确定原因,但可能与文件的用户/权限位被复制并未正确解释有关。


可能是不同的Shell问题!您可以尝试检查当前的Shell。 - UserASR
1
那解决了我的问题,但我仍然非常不满意:到底是什么原因呢? - payne
1
请看下面我的回答。他的脚本可能试图使用bash,但是alpine OS默认没有bash。将他的shebang行更改为/bin/sh即可解决此问题,而不是切换到ubuntu(它默认安装了bash)。 - Geoff
哎呀,谢谢!这不是我第一次被Alpine搞得头疼了。对我来说,这次是在WSL2中构建时发生的。我以为是\r\n的问题,但是不是,是Alpine的问题。 - undefined

6

文件找不到可能由以下原因引起:

  • 文件实际上不存在,请检查是否有误拼写,确保您没有尝试将命令和所有参数一起引用,而应该只运行命令(虽然这不是问题,但经常发生)。并确保您没有在期望运行命令的位置上覆盖挂载卷。
  • 脚本顶部的命令不存在。例如,在容器只有sh的情况下尝试调用bash。这也适用于在Windows上创建脚本并且命令末尾存在无效的换行符的情况。我不认为Alpine包含其他基础映像所包含的bash。
  • 您要运行的二进制文件链接到容器内不存在的库。这在使用musl libc版本差异的Alpine中可见。

0

我曾经遇到过类似的问题,即使我的Python应用程序非常简单(比如只是输出“hello world”的hello.py),但在运行docker-compose build && up命令时,我会收到错误提示:找不到hello.py。 后来发现问题出在Virtualbox没有正确挂载我的文件夹(app)。以下链接解决了我的问题,只用了5分钟: Docker + Ubuntu + Virtualbox: "volumes" directive in dockerfile not working


1
虽然这个链接可能回答了问题,但最好在这里包含答案的必要部分并提供链接以供参考。仅有链接的答案可能会因为链接页面的更改而失效。 - slfan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接