Docker - Ubuntu - bash: ping: commande introuvable

338

J'ai un conteneur Docker exécutant Ubuntu que j'ai fait comme suit:

docker run -it ubuntu /bin/bash

mais cela ne semble pas l'avoir fait ping. Par exemple

bash: ping: command not found

Dois-je l'installer?

Semble une commande assez basique manquante. J'ai essayé whereis pingce qui ne rapporte rien.

Snowcrash
la source
6
Il est tout à fait approprié qu'une image Docker soit minimale. Dans la plupart des cas, un conteneur ne fera jamais autre chose que d'exécuter une seule application - pourquoi installer tout ce dont cette application n'a pas besoin?
Charles Duffy
3
Si vous souhaitez simplement exécuter des diagnostics, il peut être plus simple d'exécuter busybox (dont l'image inclut le ping), par exemple: docker run -it --rm busybox ping my-server.
Francis Norton

Réponses:

689

Les images Docker sont assez minimes, mais vous pouvez installer pingdans votre image Docker Ubuntu officielle via:

apt-get update
apt-get install iputils-ping

Il est fort probable que vous n'ayez pas besoin de pingvotre image et que vous souhaitiez simplement l'utiliser à des fins de test. L'exemple ci-dessus vous aidera.

Mais si vous avez besoin de ping pour exister sur votre image, vous pouvez créer un Dockerfileou commitle conteneur dans lequel vous avez exécuté les commandes ci-dessus dans une nouvelle image.

Commettre:

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

Veuillez noter qu'il existe des meilleures pratiques pour la création d'images de docker, comme la suppression des fichiers de cache apt après et etc.

Farhad Farahi
la source
apt-get échoue avec Temporary failure resolving 'security.ubuntu.com'évidemment parce que le réseau n'est pas présent.
Pavel Niedoba
32

C'est la page Hub Docker pour Ubuntu et c'est la façon dont il est créé. Il n'a que des packages minimums (quelque peu) installés, donc si vous avez besoin de quelque chose de plus, vous devez l'installer vous-même.

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

Cependant, vous créez généralement un "Dockerfile" et le créez:

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

Veuillez utiliser Google pour trouver des didacticiels et parcourir les Dockerfiles existants pour voir comment ils font habituellement les choses :) Par exemple, la taille de l'image doit être minimisée en exécutant apt-get clean && rm -rf /var/lib/apt/lists/*après les apt-get installcommandes.

NikoNyrh
la source
echo -edéfie en fait la norme POSIX sh , qui ne lui permet pas de faire autre chose que d'imprimer -esur sa sortie. (Même avec certaines versions de bash, c'est le comportement par défaut). Utilisez printfplutôt: printf '%s\n' "FROM ubuntu" "RUN apt-get update && apt-get install -y iputils-ping" "CMD bash"et consultez la section UTILISATION DE L'APPLICATION du document de normes lié ci-dessus.
Charles Duffy
Même bash ne prendra pas en charge echo -ela façon dont vous vous y attendez (mais aura plutôt un comportement conforme aux normes) en mode POSIX compilé avec --enable-xpg-echo-default, ou avec des variables d'environnement appropriées ou une autre configuration d'exécution.
Charles Duffy
(POSIX permet à l'écho de se comporter d'une manière définie par l'implémentation lorsqu'il est donné en -ntant que premier argument, ou lorsque des littéraux de barre oblique inversée sont présents - mais même dans ce cas, il est défini par l' implémentation , non garanti standard, donc le comportement dépend du shell individuel utilisé).
Charles Duffy
Merci pour les commentaires et les améliorations, l'exemple convivial "copier-coller" était plutôt une réflexion après coup.
NikoNyrh
7

En général, les gens tirent l'image officielle d'Ubuntu / CentOS, mais ils ne réalisent pas que ces images sont minimes et n'ont rien de plus.

Pour Ubuntu, cette image est construite à partir des tarballs rootfs officiels fournis par Canonical. Étant donné qu'il s'agit d'une installation minimale d'Ubuntu, cette image inclut uniquement les paramètres régionaux C, C.UTF-8 et POSIX par défaut.

On peut installer des net-tools (inclut ifconfig, netstat), ip-utils (inclut ping) et d'autres comme curl, etc. sur le conteneur et peut créer une image à partir du conteneur ou peut écrire Dockerfile qui installera ces outils lors de la création de l'image.

Voici l'exemple de Dockerfile, lors de la création d'une image à partir de cela, il inclura ces outils:

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

ou lancez le conteneur à partir de l'image de base et installez ces utilitaires sur le conteneur, puis validez sur l'image. docker commit -m "any descriptive message" container_id image_name: lattest

Cette image aura tout installé.

Vaseem007
la source
6

Alternativement, vous pouvez utiliser une image Docker sur laquelle ping est déjà installé, par exemple busybox :

docker run --rm busybox ping SERVER_NAME -c 2
Ivan
la source
C'est une solution, mais créer une image juste pour exécuter le ping me semble exagéré. Je préfère apt-get iputils-pingsur l'image qui en a besoin.
renatoaraujoc
1

Chaque fois que vous obtenez ce genre d'erreur

bash: <command>: command not found
  • Sur un hôte avec cette commande travaillant déjà avec cette solution :

    dpkg -S $(which <command>)
    
  • Vous n'avez pas d'hôte avec ce package installé? Essayez ceci :

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

Parfois, l'installation minimale de Linux dans Docker ne définit pas le chemin d'accès et il est donc nécessaire d'appeler ping en utilisant ....

cd /usr/sbin
ping <ip>
Alex Javarotti
la source
0

J'ai utilisé la déclaration ci-dessous sur Debian 10

apt-get install iputils-ping
Anthony Wambui
la source