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

Posted

技术标签:

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

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

docker run -it ubuntu /bin/bash

但它似乎没有ping。例如

bash: ping: command not found

我需要安装它吗?

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

【问题讨论】:

最小化 Docker 镜像是完全合适的。在大多数情况下,一个容器只会运行一个应用程序——为什么要安装应用程序不需要的任何东西? 【参考方案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

以上是关于Docker - Ubuntu - bash:ping:找不到命令的主要内容,如果未能解决你的问题,请参考以下文章

Docker 教程: docker run -it ubuntu ls / 使用 git bash (Windows) 给我一个无文件/目录错误

docker ubuntu容器更换阿里源(转)

ubuntu docker怎么换成阿里源

docker常用命令

在 Raspberry Pi 上使用 open62541 服务器运行 docker 容器

Ubuntu 16.04.7 LTS在线安装安装docker