Docker - Ubuntu - bash: ping: comando no encontrado

338

Tengo un contenedor Docker que ejecuta Ubuntu, que hice de la siguiente manera:

docker run -it ubuntu /bin/bash

Sin embargo, no parece tener ping. P.ej

bash: ping: command not found

¿Necesito instalar eso?

Parece que falta un comando bastante básico. Intenté whereis pinglo que no informa nada.

Snowcrash
fuente
66
Es completamente apropiado que una imagen de Docker sea mínima. En la mayoría de los casos, un contenedor nunca hará nada más que ejecutar una sola aplicación, ¿por qué instalar algo que esa aplicación no necesita?
Charles Duffy el
3
Si simplemente desea ejecutar diagnósticos, puede ser más sencillo ejecutar busybox (cuya imagen incluye ping), por ejemplo: docker run -it --rm busybox ping my-server.
Francis Norton

Respuestas:

689

Las imágenes de Docker son bastante mínimas, pero puedes instalarlas pingen tu imagen oficial de Docker de ubuntu a través de:

apt-get update
apt-get install iputils-ping

Es probable que no necesite pingsu imagen y solo quiera usarla para fines de prueba. El ejemplo anterior te ayudará.

Pero si necesita que exista ping en su imagen, puede crear uno Dockerfileo commitel contenedor en el que ejecutó los comandos anteriores en una nueva imagen.

Cometer:

docker commit -m "Installed iputils-ping" --author "Your Name <[email protected]>" ContainerNameOrId yourrepository/imagename:tag

Dockerfile:

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

Tenga en cuenta que existen prácticas recomendadas para crear imágenes acoplables, como borrar archivos de caché de apt después, etc.

Farhad Farahi
fuente
apt-get falla Temporary failure resolving 'security.ubuntu.com'obviamente porque la red no está presente.
Pavel Niedoba
32

Esta es la página de Docker Hub para Ubuntu y así es como se crea. Solo tiene (mínimo) paquetes mínimos instalados, por lo tanto, si necesita algo adicional, debe instalarlo usted mismo.

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

Sin embargo, generalmente crearía un "Dockerfile" y lo crearía:

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

Por favor, utilizar Google para encontrar tutoriales y Dockerfiles Buscar existentes para ver cómo se suelen hacer cosas :) Por ejemplo, tamaño de la imagen debe reducirse al mínimo mediante la ejecución apt-get clean && rm -rf /var/lib/apt/lists/*después de apt-get installcomandos.

NikoNyrh
fuente
echo -een realidad desafía el estándar POSIX sh , que no le permite hacer nada más que imprimir -een su salida. (Incluso con algunas versiones de bash, ese es el comportamiento predeterminado). Use en su printflugar: printf '%s\n' "FROM ubuntu" "RUN apt-get update && apt-get install -y iputils-ping" "CMD bash"y vea la sección USO DE APLICACIONES del documento de estándares vinculado anteriormente.
Charles Duffy el
Incluso bash no admitirá echo -ela forma en que lo espera (sino que tendrá un comportamiento compatible con los estándares) cuando se compile con el modo POSIX --enable-xpg-echo-defaulto con las variables de entorno apropiadas u otra configuración de tiempo de ejecución.
Charles Duffy el
(POSIX permite que el eco se comporte de una manera definida por la implementación cuando se da -ncomo primer argumento, o cuando hay literales de barra invertida, pero aun así, está definido por la implementación , no está garantizado por el estándar, por lo que el comportamiento depende del shell individual en uso).
Charles Duffy el
Gracias por los comentarios y las mejoras, el ejemplo amigable de "copiar y pegar" fue más que un pensamiento posterior.
NikoNyrh
7

En general, las personas obtienen la imagen oficial de Ubuntu / CentOS, pero no se dan cuenta de que estas imágenes son mínimas y no tienen nada más.

Para Ubuntu, esta imagen está construida a partir de tarballs rootfs oficiales proporcionados por Canonical. Dado que es una instalación mínima de Ubuntu, esta imagen solo incluye las configuraciones regionales C, C.UTF-8 y POSIX de forma predeterminada.

Uno puede instalar net-tools (incluye ifconfig, netstat), ip-utils (incluye ping) y otros me gusta curl, etc. en el contenedor y puede crear una imagen desde el contenedor o puede escribir Dockerfile que instalará estas herramientas mientras crea la imagen.

A continuación se muestra el ejemplo de Dockerfile, al crear una imagen a partir de esto, incluirá estas herramientas:

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

o inicie el contenedor desde la imagen base e instale estas utilidades en el contenedor y luego confirme la imagen. docker commit -m "cualquier mensaje descriptivo" id_contenedor nombre_imagen: lattest

Esa imagen tendrá todo instalado.

Vaseem007
fuente
6

Alternativamente, puede usar una imagen Docker que ya tiene ping instalado, por ejemplo busybox :

docker run --rm busybox ping SERVER_NAME -c 2
Ivan
fuente
Es una solución, pero crear una imagen solo para ejecutar ping me parece excesivo. Prefiero apt-get iputils-pingla imagen que lo necesita.
renatoaraujoc
1

Cada vez que tienes este tipo de error

bash: <command>: command not found
  • En un host con ese comando que ya funciona con esta solución :

    dpkg -S $(which <command>)
    
  • ¿No tienes un host con ese paquete instalado? Intenta esto :

    apt-file search /bin/<command>
    
Pablo A
fuente
1

A veces, la instalación mínima de Linux en Docker no define la ruta y, por lo tanto, es necesario llamar al ping usando ...

cd /usr/sbin
ping <ip>
Alex Javarotti
fuente
0

He usado la siguiente declaración en Debian 10

apt-get install iputils-ping
Anthony Wambui
fuente