【问题标题】:Error: Cannot Start Container: stat /bin/sh: no such file or directory" [closed]错误:无法启动容器:stat /bin/sh:没有这样的文件或目录” [关闭]
【发布时间】:2015-06-14 14:43:04
【问题描述】:

我一直在尝试创建自己的 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" 

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

【问题讨论】:

    标签: docker busybox


    【解决方案1】:

    创建图像后,检查它:

    $ docker inspect $image_name 
    

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

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

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

    【讨论】:

    • "Cmd": [ "/bin/sh", "-c", "#(nop) ADD file:905ed83e56295de9b6eb24708b583e78e4e9a06d3a80184276b55b5db04d70aa in /" ],它只是 /bin/sh。
    • 如果你想运行容器你必须提供将由容器执行的任务,现在docker正在执行/bin/sh。例如,如果您想在容器中运行 jar,请尝试 java -jar yourjar.jar
    • 这就是我的想法。是否无法获得带有busybox图像的交互式shell?我还能在busybox容器中运行什么?
    • @wsl,该链接是关于在 docker 中运行 Java。这个问题与Java无关。
    • 上面的评论说"Cmd": [ "/bin/sh", "-c", "#(nop) ADD file:905ed83e56295de9b6eb24708b583e78e4e9a06d3a80184276b55b5db04d70aa in /" ] - 注意ADD 的东西;您的Dockerfile 中有错字。
    【解决方案2】:

    我在运行命令时遇到了这个错误(“stat /bin/bash: no such file or directory”):

    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
    

    【讨论】:

    • 如果CMD部分有null怎么办?
    • 嗯,这应该意味着您的容器中没有运行任何命令。你有 Dockerfile 的链接吗?
    【解决方案3】:

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

    $ docker exec -it <container id> sh
    

    【讨论】:

      【解决方案4】:

      这个错误

      docker:来自守护进程的错误响应:OCI 运行时创建失败: container_linux.go:348:启动容器进程导致“exec: \"/bin/sh\": stat /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"]
      

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

      【讨论】:

      • As of Docker 1.5.0 (specifically, docker/docker#8827), FROM scratch is a no-op in the Dockerfile. Using the scratch “image” signals to the build process that you want the next command in the Dockerfile to be the first filesystem layer in your image. 这意味着您的容器不包含 /bin/sh 或其他任何内容(我假设的 linux 内核除外)
      • 是的,您没有附加到映像的内核。运行任何 Linux 命令或依赖 docker shell 的命令都会失败。
      【解决方案5】:

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

      "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

      【讨论】:

        【解决方案6】:

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

        所以, docker run --rm -it &lt;image&gt;:latest //bin/bash

        【讨论】:

        • 多么棒的小把戏。我不知道这件事。
        【解决方案7】:

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

        FROM ubuntu:14.04
        

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

        【讨论】:

          【解决方案8】:

          我也遇到过类似的问题:

          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 &lt;imagename&gt;)并再次拉动它(docker pull &lt;imagename&gt;)的问题。

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

            • 是的,我做到了。结果是一样的。
            猜你喜欢
            • 1970-01-01
            • 2019-03-17
            • 1970-01-01
            • 2021-09-17
            • 2014-05-30
            • 2019-12-10
            • 1970-01-01
            • 2018-11-14
            • 2015-12-27
            相关资源
            最近更新 更多