ChatGPT解决这个技术问题 Extra ChatGPT

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

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

docker run -it ubuntu /bin/bash

但是它似乎没有ping。例如

bash: ping: command not found

我需要安装它吗?

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

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

P
Pang

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 <container> /bin/bash。其中 -u 0 是用户 root。
F
Farhad Farahi

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 && rm -rf /var/lib/apt/lists/* 来最小化图像大小。


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

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

docker run --rm busybox ping SERVER_NAME -c 2

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

通常人们会拉取 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

该图像将安装所有东西。


A
Alex Javarotti

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

cd /usr/sbin
ping <ip>

A
Anthony Wambui

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

apt-get install iputils-ping

P
Pablo Bianchi

每次遇到这种错误

bash: <command>: command not found

在具有该命令的主机上已经使用此解决方案: dpkg -S $(which )

没有安装该软件包的主机?试试这个:apt-file search /bin/


L
LWimsey

或者,您可以在进入容器的网络命名空间后在主机上运行 ping

首先,在主机上找到容器的进程 ID(这可以是 shell 或您在容器内运行的应用程序)。然后切换到容器的网络命名空间(在主机上以 root 运行):

host# PS1='container# ' nsenter -t <PID> -n

修改 PS1 环境变量仅用于在您位于容器的网络命名空间中时显示不同的提示。

现在您可以使用 pingnetstatifconfigip 等,前提是它们已安装在主机上。

container# ping <IP>
container# ip route get <IP>
....
container# exit

请记住,这只更改了网络命名空间,挂载命名空间(文件系统)没有更改,因此名称解析可能无法正常工作(它仍在使用主机上的 /etc/hosts 文件)