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
存在于您的镜像中,您可以创建一个Dockerfile
或commit
将您运行上述命令的容器放入一个新镜像中。
提交:
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。【参考方案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 && rm -rf /var/lib/apt/lists/*
来最小化图像大小。
【讨论】:
echo -e
实际上是defies the POSIX sh standard,除了在其输出上打印-e
之外,它不允许它做任何事情。 (即使使用某些版本的 bash,这也是默认行为)。请改用printf
:printf '%s\n' "FROM ubuntu" "RUN apt-get update && 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) 给我一个无文件/目录错误