Docker-Ubuntu-bash:ping:找不到命令


337

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

docker run -it ubuntu /bin/bash

但是它似乎没有ping。例如

bash: ping: command not found

我需要安装吗?

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


6
最小化Docker映像是完全合适的。在大多数情况下,容器只运行一个应用程序就不会做任何事情-为什么要安装该应用程序不需要的任何内容?
查尔斯·达菲

3
如果只想运行诊断程序,则运行busybox(该映像包括ping)可能会更简单,例如:docker run -it --rm busybox ping my-server。
弗朗西斯·诺顿

Answers:


688

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

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'原因很明显,因为不存在网络。
Pavel Niedoba '19

32

是对Ubuntu的泊坞窗中心页面,是它是如何创建的。它仅安装了(略有)最低限度的软件包,因此,如果您需要其他任何内容,则需要自己安装。

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 clean && rm -rf /var/lib/apt/lists/*apt-get install命令后运行来最小化图像大小。


echo -e实际上违反了POSIX sh标准,该标准除了-e在输出上进行打印外,不允许执行任何其他操作。(即使使用某些版本的bash,这也是默认行为)。使用printf来代替:printf '%s\n' "FROM ubuntu" "RUN apt-get update && apt-get install -y iputils-ping" "CMD bash",看看上面的链接标准文档的实际应用信息部分。
查尔斯·达菲

echo -e在POSIX模式下,使用--enable-xpg-echo-default,或适当的环境变量或其他运行时配置编译时,即使bash也不支持您期望的方式(而是具有符合标准的行为)。
查尔斯·达菲

(POSIX允许echo -n作为第一个参数给出时或在存在任何反斜杠文字时以实现定义的方式运行-但即使如此,它也是实现定义的,而不是标准保证的,因此行为取决于单个shell正在使用)。
查尔斯·达菲

感谢您的评论和改进,“复制粘贴”友好示例更多是事后的思考。
NikoNyrh,2013年

7

通常,人们会使用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

该映像将安装所有内容。


6

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

docker run --rm busybox ping SERVER_NAME -c 2

这是一个解决方案,但是对我来说创建映像只是为了执行ping似乎有些过头。我宁愿apt-get iputils-ping在需要它的图像上。
renatoaraujoc

1

每次遇到这种错误

bash: <command>: command not found
  • 在具有该命令的主机上已经可以使用此解决方案

    dpkg -S $(which <command>)
    
  • 没有安装该软件包的主机?试试这个

    apt-file search /bin/<command>
    

1

有时,在Docker中最少安装Linux并没有定义路径,因此有必要使用...来调用ping。

cd /usr/sbin
ping <ip>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.