错误:无法启动容器:stat / bin / sh:没有这样的文件或目录"

时间:2015-04-09 09:43:27

标签: docker busybox

我一直在尝试创建自己的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 repo可以使用该图像。

# 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" 

我无法理解为什么会出现这个错误?难道我做错了什么?我怎样才能验证我正在创建一个处于工作状态的正确图像?

9 个答案:

答案 0 :(得分:13)

创建图像后,请使用以下方法进行检查:

$ docker inspect $ image_name

并检查CMD选项中的内容,对于忙碌框,它应该是: " Cmd":[      " / bin / sh的" ] 也许你正在重写./mkimage.sh

中的CMD选项

答案 1 :(得分:7)

我在运行命令时遇到了这个错误(" stat / bin / bash:没有这样的文件或目录"):

docker exec -it 80372bc2c41e /bin/bash

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

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

答案 2 :(得分:7)

此错误

  

docker:来自守护程序的错误响应:OCI运行时创建失败:   container_linux.go:348:启动容器进程引起“执行:   \“ / bin / sh \”:统计信息/ bin / sh:没有这样的文件或目录“:未知。

从基础映像创建docker映像时发生

scratch。这是因为生成的图像没有外壳来执行该图像。如果您使用:

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"]

希望这对以后的人有帮助。

答案 3 :(得分:3)

使用命令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

答案 4 :(得分:2)

在使用Docker Toolbox / Machine的Windows(msys)上,我不得不在/之前添加一个额外的/bin/bash,以表明它是* nix文件路径。

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

答案 5 :(得分:2)

使用$ docker inspect,如果图像在输出中没有/bin/bash,则可以使用下面的命令:它非常适合我

$ docker exec -it <container id> sh

答案 6 :(得分:1)

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

FROM ubuntu:14.04

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

答案 7 :(得分:0)

你/ bin / sh没有shell吗?你试过docker run -it pensu/busybox /usr/bin/sh吗?

答案 8 :(得分:0)

我有一个类似的问题:

node_id = 3

def datatree_path_summarystats(node_id):
    for k, v in paths.items():
        if node_id in v:
            d = k,v

    ruleskey = d[0]
    numberofsteps = sum(map(lambda x : x<node_id, d[1]))

    for k, v in rules.items():
        if k == ruleskey:
            b = k,v

    stringsubset = b[1]

    datasubset = "&".join(stringsubset.split('&')[:numberofsteps])
    return datasubset

datasubset = datatree_path_summarystats(node_id)

df[eval(datasubset)]

就我而言,我知道该图像在其他地方也可以使用,那是一个损坏的本地图像。 我解决了删除图像(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>,但我认为这不是强制性的。