【问题标题】:Met "/bin/bash: no such file" when building docker image from scratch从头开始构建 docker 映像时遇到“/bin/bash: no such file”
【发布时间】:2016-01-10 01:29:59
【问题描述】:

我正在尝试在 ubuntu-14 系统中创建自己的 docker 映像。

我的 docker 文件如下:

FROM scratch
RUN /bin/bash -c 'echo "hello"'

我在运行docker build .时收到错误消息:

exec: "/bin/sh": stat /bin/sh: no such file or directory

我猜这是因为/bin/sh 不存在于基本图像“scratch”中。我该如何解决这个问题?

【问题讨论】:

    标签: bash docker dockerfile


    【解决方案1】:

    Docker 基本上是一个容器化工具,与虚拟机相比,它有助于构建系统并让它们在闪存中启动和运行,而不会占用大量资源。

    Docker 容器基本上是一个分层容器。 如果您碰巧读取了一个 Dockerfile,该文件中的每个命令都会导致在容器中创建一个新层和最后一层在 Dockerfile 中的所有命令都已执行之后,您的容器实际上是什么。

    Dockerhub 上可用的镜像专门针对这种环境进行了优化,并且非常易于设置和构建。如果您从头开始构建容器,即没有任何基础映像,那么您基本上拥有的是一个空容器。一个空容器无法理解 /bin/bash 究竟是什么,因此它对你不起作用。

    Docker 容器不使用您的底层操作系统的任何细节。多个 docker 容器将以有效的方式利用相同的底层内核。而已。没有其他的。 ( 但是有一个volumes的概念,其中容器在本地底层系统上共享一个特定的volume )

    所以如果你想使用 /bin/bash,你需要一个基础镜像来为你的容器设置这个命令的细节,然后你就可以成功地执行它。

    但是,建议您使用 Ubuntu 的官方 Docker 映像,然后在其上安装您的自定义内容。官方图片来自制造商,并针对这种环境进行了高度优化。

    【讨论】:

      【解决方案2】:

      基础映像scratch 不使用/bin/bash。所以你应该改为:

      FROM ubuntu:14.04
      RUN /bin/sh -c 'echo "hello"'
      

      【讨论】:

      • 它也没有用。你知道这是怎么发生的吗?
      • 你试过FROM ubuntu:14.04吗?
      • FROM ubuntu:14.04 有效。恐怕这是唯一的办法。我虽然有一些技巧可以将 /bin/bash 从主机系统带到 docker 容器。不过感谢您的帮助:)
      • @NameTooLongException 你没有抓住重点......容器旨在将正在运行的进程与主机系统隔离开来。这是一件好事。如果你需要一个 bash shell,你要么在里面构建它(哑),要么使用已经包含它的基本容器(智能)。如果您不喜欢 ubuntu,可以使用更轻的图像,例如busybox。最后注意不要过度优化。如果您使用相同的基础映像运行大量容器,则该映像仍然只下载一次。与下载大量定制的基础图像相比,效率要高得多。
      • 感谢您的宝贵意见 :) @MarkO'Connor
      猜你喜欢
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      相关资源
      最近更新 更多