【问题标题】:Docker - Ubuntu - bash: ping: command not foundDocker - Ubuntu - bash:ping:找不到命令
【发布时间】:2017-02-15 12:18:14
【问题描述】:

我有一个运行 Ubuntu 的 Docker 容器,我做了如下操作:

docker run -it ubuntu /bin/bash

但它似乎没有ping。例如

bash: ping: command not found

我需要安装它吗?

似乎缺少一个非常基本的命令。我试过whereis ping 没有报告任何内容。

【问题讨论】:

  • 最小化 Docker 镜像是完全合适的。在大多数情况下,一个容器只会运行一个应用程序——为什么要安装应用程序不需要的任何东西?

标签: ubuntu docker ping


【解决方案1】:

Docker 镜像非常小,但您可以通过以下方式在官方 ubuntu docker 镜像中安装 ping

apt-get update
apt-get install iputils-ping

您的图像上可能不需要ping,而只是想将其用于测试目的。上面的例子会帮助你。

但如果您需要ping 存在于您的镜像中,您可以创建一个Dockerfilecommit 将您运行上述命令的容器放入一个新镜像中。

提交:

docker commit -m "Installed iputils-ping" --author "Your Name <name@domain.com>" ContainerNameOrId yourrepository/imagename:tag

Dockerfile:

FROM ubuntu
RUN apt-get update && apt-get install -y iputils-ping
CMD bash

请注意,创建 docker 镜像有一些最佳实践,例如事后清除 apt 缓存文件等。

【讨论】:

  • apt-get 失败,Temporary failure resolving 'security.ubuntu.com' 显然是因为网络不存在。
  • 我养成了使用apt install 的习惯,结果出现“找不到包”,但正如答案所说,apt-get 工作正常。
  • 如果需要安装在运行的容器上需要root权限执行,所以执行docker exec -u 0 -it &lt;container&gt; /bin/bash。其中-u 0 是用户root。
【解决方案2】:

我在 debian 10 上使用过以下语句

apt-get install iputils-ping

【讨论】:

    【解决方案3】:

    This 是 Ubuntu 的 Docker Hub 页面,this 是它的创建方式。它只安装了(有点)最低限度的软件包,因此如果您需要任何额外的东西,您需要自己安装。

    apt-get update && apt-get install -y iputils-ping
    

    但是通常你会创建一个“Dockerfile”并构建它:

    mkdir ubuntu_with_ping
    cat >ubuntu_with_ping/Dockerfile <<'EOF'
    FROM ubuntu
    RUN apt-get update && apt-get install -y iputils-ping
    CMD bash
    EOF
    docker build -t ubuntu_with_ping ubuntu_with_ping
    docker run -it ubuntu_with_ping
    

    请使用 Google 查找教程并浏览现有的 Dockerfile 以查看它们通常是如何做事的 :) 例如,应通过在 apt-get install 命令之后运行 apt-get clean &amp;&amp; rm -rf /var/lib/apt/lists/* 来最小化图像大小。

    【讨论】:

    • echo -e 实际上是defies the POSIX sh standard,除了在其输出上打印-e 之外,它不允许它做任何事情。 (即使使用某些版本的 bash,这也是默认行为)。请改用printfprintf '%s\n' "FROM ubuntu" "RUN apt-get update &amp;&amp; apt-get install -y iputils-ping" "CMD bash",并查看上述链接标准文档的应用使用部分。
    • 在使用--enable-xpg-echo-default 编译的POSIX 模式下,或使用适当的环境变量或其他运行时配置。
    • (当给定-n 作为第一个参数时,或者当存在任何反斜杠文字时,POSIX 允许 echo 以实现定义的方式运行——但即便如此,它也是 实现定义的,不是标准保证的,因此行为取决于使用的单个 shell)。
    • 感谢 cmets 和改进,“复制和粘贴”友好示例更多的是事后考虑。
    【解决方案4】:

    有时,Docker 中 Linux 的最小安装并没有定义路径,因此需要使用 .... 调用 ping。

    cd /usr/sbin
    ping <ip>
    

    【讨论】:

      【解决方案5】:

      每次遇到这种错误

      bash: <command>: command not found
      
      • 在具有该命令的主机上已经使用this solution

        dpkg -S $(which <command>)
        
      • 没有安装该软件包的主机? Try this:

        apt-file search /bin/<command>
        

      【讨论】:

        【解决方案6】:

        通常人们会拉取 Ubuntu/CentOS 的官方镜像,但他们没有意识到这些镜像非常小,而且上面没有任何东西。

        对于 Ubuntu,此映像是从 Canonical 提供的官方 rootfs tarball 构建的。鉴于它是 Ubuntu 的最小安装,默认情况下此映像仅包含 C、C.UTF-8 和 POSIX 语言环境。

        可以在容器上安装 net-tools(包括 ifconfig、netstat)、ip-utils(包括 ping)和 curl 等,并且可以从容器创建映像,或者可以编写 Dockerfile,在创建映像时安装这些工具。

        以下是 Dockerfile 示例,在从中创建映像时,它将包含以下工具:

        FROM vkitpro/ubuntu16.04
        RUN     apt-get  update -y \
        && apt-get upgrade -y \
        && apt-get install iputils-ping -y \
        && apt-get install net-tools -y \
        CMD bash
        

        或者从基础镜像启动容器并在容器上安装这些实用程序,然后提交到镜像。 docker commit -m "任何描述性消息" container_id image_name:lattest

        该图像将安装所有东西。

        【讨论】:

          【解决方案7】:

          或者,您可以使用已安装 ping 的 Docker 映像,例如busybox:

          docker run --rm busybox ping SERVER_NAME -c 2
          

          【讨论】:

          • 这是一个解决方案,但创建一个图像只是为了执行 ping 对我来说似乎有点过头了。我宁愿在需要它的图像上apt-get iputils-ping
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-27
          • 2014-09-11
          • 1970-01-01
          • 1970-01-01
          • 2022-11-28
          • 2021-02-02
          • 1970-01-01
          相关资源
          最近更新 更多