错误:无法启动容器:stat /bin/sh:没有这样的文件或目录”[已关闭]

问题描述 投票:0回答:8

我一直在尝试创建自己的 busybox 基础镜像。

# ./mkimage.sh -t pensu/busybox busybox-static
+ mkdir -p /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs
+ tar --numeric-owner -caf /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs.tar.xz -C /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs '--transform=s,^./,,' .
+ cat > '/var/tmp/docker-mkimage.US3tHy0uBQ/Dockerfile'
+ rm -rf /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs
+ docker build -t pensu/busybox /var/tmp/docker-mkimage.US3tHy0uBQ
Sending build context to Docker daemon 863.2 kB
Sending build context to Docker daemon 
Step 0 : FROM scratch
 ---> 
Step 1 : ADD rootfs.tar.xz /
 ---> 8eac78bfc9d6
Removing intermediate container ad9bbb8f7536
Successfully built 8eac78bfc9d6
+ rm -rf /var/tmp/docker-mkimage.US3tHy0uBQ

我可以看到该图像可在我的 docker 存储库中使用。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
pensu/busybox       latest              8eac78bfc9d6        7 seconds ago       2.476 MB

但是当我尝试执行 docker run 时,我总是收到错误:

# docker run -it pensu/busybox /bin/sh
exec: "/bin/sh": stat /bin/sh: no such file or directorytime="2015-04-09T16:03:45+05:30" level="fatal" msg="Error response from daemon: Cannot start container 8fe73b7832193c847d7975175a4be86d1f0b550b6a00b812bd4cdd18fe752468: exec: \"/bin/sh\": stat /bin/sh: no such file or directory" 

我无法理解为什么会出现该错误?我做错了什么吗?我还能如何验证我正在创建处于工作状态的正确图像?

docker busybox
8个回答
89
投票

创建图像后,请使用以下命令检查:

$ docker inspect $image_name 

并检查 CMD 选项中的内容。对于繁忙的盒子应该是:

"Cmd": [
     "/bin/sh"
]

也许您正在覆盖 ./mkimage.sh 中的 CMD 选项


50
投票

使用

$ docker inspect [imageID]
如果图像输出中没有
/bin/bash
,您可以使用下面的命令:它对我来说非常有用

$ docker exec -it <container id> sh

-it
标志让您可以通过分配伪tty并保持标准输入打开来与容器交互。


45
投票

运行命令时遇到此错误(“stat /bin/bash:没有这样的文件或目录”):

docker exec -it 80372bc2c41e /bin/bash

解决方案是识别容器上可用的终端(或外壳)类型。为此,我跑了:

docker inspect 80372bc2c41e

在该命令的输出中,我看到:

"Cmd": [
    "/bin/sh",
    "-c",
    "gunicorn -b 0.0.0.0:7082 server.app:app"
],

这告诉我有一个可用的

/bin/sh
命令,并且我能够连接:

docker exec -it 80372bc2c41e /bin/sh

19
投票

这个错误

docker:来自守护进程的错误响应:OCI 运行时创建失败: container_linux.go:348:启动容器进程导致“exec: \“/ bin / sh \”:stat / bin / sh:没有这样的文件或目录“:未知。

从基础镜像创建 docker 镜像时发生,例如。

scratch
。这是因为生成的映像没有执行该映像的 shell。如果您使用:

ENV EXECUTABLE hello
cmd [$EXECUTABLE]

在您的 docker 文件中,docker 使用 /bin/sh 来解析输入字符串。因此出现错误。检查图像,您会发现:

$docker inspect <image-name>
"Entrypoint": [
                "/bin/sh",
                "-c",
                "[$HM_APP]"
            ]

这意味着 ENTRYPOINT 或 CMD 参数将使用 /bin/sh -c 进行解析。对我有用的解决方案是将命令解析为 JSON 字符串数组,例如

cmd ["hello"]

并再次检查图像:

"Entrypoint": [
                "hello"
            ]

这消除了对 /bin/sh 的依赖,docker 应用程序现在可以执行二进制文件。示例:

FROM scratch

# Environmental variables

# Copy files
ADD . /
# Home dir
WORKDIR /bin

EXPOSE 8083
ENTRYPOINT ["hospitalms"]

希望这对将来的人有帮助。


7
投票

在使用 Docker Toolbox/Machine 的 Windows (msys) 上,我必须在

/
之前添加额外的
/bin/bash
以指示它是 *nix 文件路径。

所以,

docker run --rm -it <image>:latest //bin/bash


5
投票

使用命令

cmd
检查您的图像
docker inspect image_name
。输出可能是这样的:

"Cmd": [
    "/bin/bash",
    "-c",
    "#(nop) ",
    "CMD [\"/bin/bash\"]"
],

所以使用命令

docker exec -it container_id /bin/bash
。如果您的
cmd
输出与此不同:

"Cmd": [
    "/bin/sh",
    "-c",
    "#(nop) ",
    "CMD [\"/bin/sh\"]"
],

在上面的命令中使用

/bin/sh
代替
/bin/bash


1
投票

我也有类似的问题:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown.

就我而言,我知道该图像在其他地方可以工作,然后是损坏的本地图像。 我解决了删除图像(

docker rmi <imagename>
)并再次拉动它(
docker pull <imagename>
)的问题。

我也做了

docker system prune
,但我认为这不是强制性的。


0
投票

在您尝试运行的 docker 文件中明确提及 ubuntu 版本,

FROM ubuntu:14.04

不要像

FROM ubuntu:Latest
那样使用。这解决了我上面的“无法启动容器:stat /bin/sh:没有这样的文件或目录”问题

© www.soinside.com 2019 - 2024. All rights reserved.