启动容器进程引起了“exec: \"/bin/sh\": stat /bin/sh: no such file or directory”错误:未知。

37

我希望了解CMD和ENTRYPOINT的工作原理。因此,我创建了一个非常简单的Dockerfile

FROM scratch

CMD echo "Hello First"

ENTRYPOINT echo "Hello second" 

然后我构建了这个镜像:
docker build -t my_image .

以下是日志记录:

步骤 1/3:来自 scratch ---> 步骤 2/3:CMD echo "Hello First" ---> 使用缓存 ---> 9f2b6a00982f 步骤 3/3:ENTRYPOINT echo "Hello second" ---> 使用缓存 ---> 1bbe520f9526 成功构建 1bbe520f9526 成功标记 my_image:latest 安全警告:您正在从 Windows 构建 Docker 镜像,针对非 Windows Docker 主机。添加到构建上下文的所有文件和目录都将具有 '-rwxr-xr-x' 权限。建议仔细检查并重置敏感文件和目录的权限。

当我创建此镜像的容器时,返回:

docker run my_image

错误信息如下:

docker: 容器运行时创建失败: container_linux.go:344: 启动容器进程导致"exec: \"/bin/sh\": stat /b in/sh: no such file or directory": 未知错误.

请问有人能帮忙解决这个错误吗?


请参考以下链接:https://dev59.com/mmEi5IYBdhLWcg3wK5rd - Thilak
我想要[编辑]您的问题,以修复Docker构建记录和错误消息的格式,但我无法猜测它们的真实样子。请使用代码格式化计算机消息,或者至少不要重新换行。 - tripleee
1个回答

37

这里发生了两件事情。

使用FROM scratch开始的Dockerfile从一个完全没有任何内容的基础镜像开始。它是完全空的,并且除了一些Docker为您提供的设备文件外,没有基础工具、库或其他任何东西。

ENTRYPOINT echo ...命令被Docker重写为ENTRYPOINT ["/bin/sh", "-c", "echo ..."],并且会导致CMD完全被忽略。除非使用docker run --entrypoint覆盖,否则它将成为容器运行的主进程。

由于它是一个FROM scratch镜像,绝对没有任何内容,因此它不包含shell,因此会出现“/bin/sh: no such file or directory”错误。


3
我该如何将sh安装到镜像中? - Mehraj Malik
2
构建“FROM scratch”的镜像是一种高级话题。使用“FROM ubuntu:18.04”可能会给您提供一个更熟悉的环境。 - David Maze
嗨 @DavidMaze,当在Virtualbox中运行的Linux虚拟机中启动boot2docker.iso时,/bin/sh存在或者说是由busybox实现的。从零开始的FROM scratch与启动发布的boot2docker.iso有何不同? - Adam.at.Epsilon
2
Boot2Docker是一个虚拟机,而不是Docker镜像。此外,在FROM scratch中没有任何内容。实际上什么都没有。没有Busybox。如果您需要/bin/sh(99%,但不是100%的镜像),则有一个busybox镜像具有它,但通常人们从alpine开始,它可以运行大多数编译程序并且更容易扩展。 - David Maze
@DavidMaze 谢谢。在Virtualbox中运行boot2docker.iso是否可以合理地假设与使用FROM docker然后使用RUN启动脚本相同的执行环境(用于程序或脚本)? - Adam.at.Epsilon
不,它们会非常不同(无论是文件系统还是其他正在运行的进程)。 - David Maze

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