Docker - Ubuntu - bash: ping: Befehl nicht gefunden


336

Ich habe einen Docker-Container mit Ubuntu, der wie folgt ausgeführt wurde:

docker run -it ubuntu /bin/bash

es scheint jedoch nicht zu haben ping. Z.B

bash: ping: command not found

Muss ich das installieren?

Scheint ein ziemlich grundlegender Befehl zu fehlen. Ich habe versucht, whereis pingwas nichts meldet.


6
Es ist völlig angemessen, dass ein Docker-Image minimal ist. In den meisten Fällen kann ein Container nur eine einzelne Anwendung ausführen. Warum sollte etwas installiert werden, das diese Anwendung nicht benötigt?
Charles Duffy

3
Wenn Sie lediglich eine Diagnose ausführen möchten, ist es möglicherweise einfacher, eine Busybox auszuführen (das Image enthält Ping), z. B.: Docker run -it --rm Busybox Ping My-Server.
Francis Norton

Antworten:


686

Docker-Images sind ziemlich minimal, aber Sie können sie pingin Ihrem offiziellen Ubuntu-Docker-Image installieren über:

apt-get update
apt-get install iputils-ping

Möglicherweise benötigen Sie pingIhr Bild nicht und möchten es nur zu Testzwecken verwenden. Das obige Beispiel hilft Ihnen dabei.

Wenn Sie jedoch Ping für Ihr Image benötigen, können Sie einen Dockerfileoder commitden Container, in dem Sie die obigen Befehle ausgeführt haben, für ein neues Image erstellen .

Verpflichten:

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

Bitte beachten Sie, dass es bewährte Methoden zum Erstellen von Docker-Images gibt, z. B. das Löschen geeigneter Cache-Dateien nach usw.


apt-get schlägt Temporary failure resolving 'security.ubuntu.com'offensichtlich fehl, weil kein Netzwerk vorhanden ist.
Pavel Niedoba

32

Dies ist die Docker Hub-Seite für Ubuntu und so wird sie erstellt. Es sind nur (etwas) minimale Pakete installiert. Wenn Sie also etwas extra benötigen, müssen Sie es selbst installieren.

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

Normalerweise erstellen Sie jedoch eine "Docker-Datei" und erstellen sie:

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

Verwenden Sie Google, um Tutorials zu finden und vorhandene Docker-Dateien zu durchsuchen, um zu sehen, wie sie normalerweise funktionieren :) Zum Beispiel sollte die Bildgröße durch Ausführen apt-get clean && rm -rf /var/lib/apt/lists/*von apt-get installBefehlen minimiert werden.


echo -eTatsächlich widerspricht es dem POSIX sh-Standard , der es ihm nur erlaubt, -eauf seiner Ausgabe zu drucken . (Selbst bei einigen Versionen von Bash ist dies das Standardverhalten.) Verwenden Sie printfstattdessen: printf '%s\n' "FROM ubuntu" "RUN apt-get update && apt-get install -y iputils-ping" "CMD bash"und lesen Sie den Abschnitt ANWENDUNGSANWENDUNG des oben verlinkten Standarddokuments.
Charles Duffy

Selbst Bash unterstützt nicht echo -edie erwartete Leistung (sondern weist stattdessen ein standardkonformes Verhalten auf), wenn im POSIX-Modus mit --enable-xpg-echo-defaultoder mit geeigneten Umgebungsvariablen oder einer anderen Laufzeitkonfiguration kompiliert wird .
Charles Duffy

(Mit POSIX kann sich das Echo implementierungsdefiniert verhalten, wenn es -nals erstes Argument angegeben wird oder wenn Backslash-Literale vorhanden sind. Aber selbst dann ist es implementierungsdefiniert und nicht standardgarantiert, sodass das Verhalten von der einzelnen Shell abhängt in Benutzung).
Charles Duffy

Vielen Dank für Kommentare und Verbesserungen. Das freundliche Beispiel zum Kopieren und Einfügen war eher ein nachträglicher Gedanke.
NikoNyrh

7

Im Allgemeinen ziehen die Leute das offizielle Image von Ubuntu / CentOS, aber sie erkennen nicht, dass diese Images minimal sind und nichts darüber haben.

Für Ubuntu basiert dieses Image auf offiziellen Rootfs-Tarballs von Canonical. Da es sich um eine minimale Installation von Ubuntu handelt, enthält dieses Image standardmäßig nur die Gebietsschemas C, C.UTF-8 und POSIX.

Man kann Net-Tools (einschließlich ifconfig, netstat), IP-Utils (einschließlich Ping) und andere ähnliche Curl-Elemente usw. auf dem Container installieren und ein Image aus dem Container erstellen oder eine Docker-Datei schreiben, die dieses Tool beim Erstellen des Images installiert.

Unten finden Sie ein Dockerfile-Beispiel. Beim Erstellen eines Images daraus werden die folgenden Tools enthalten:

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

oder starten Sie den Container vom Basis-Image und installieren Sie diese Dienstprogramme auf dem Container. Legen Sie dann das Image fest. Docker Commit -m "jede beschreibende Nachricht" container_id image_name: lattest

Auf diesem Image ist alles installiert.


6

Alternativ können Sie ein Docker-Image verwenden, auf dem bereits Ping installiert ist, z. B. Busybox :

docker run --rm busybox ping SERVER_NAME -c 2

Es ist eine Lösung, aber ein Image nur zum Ausführen von Ping zu erstellen, scheint mir übertrieben. Ich würde lieber apt-get iputils-pingauf das Bild, das es braucht.
Renatoaraujoc

1

Jedes Mal, wenn Sie diese Art von Fehler erhalten

bash: <command>: command not found
  • Auf einem Host mit diesem Befehl, der bereits mit dieser Lösung arbeitet :

    dpkg -S $(which <command>)
    
  • Sie haben noch keinen Host mit diesem Paket installiert? Versuchen Sie dies :

    apt-file search /bin/<command>
    

1

Manchmal definiert die minimale Installation von Linux in Docker den Pfad nicht und daher ist es notwendig, Ping mit .... aufzurufen.

cd /usr/sbin
ping <ip>

0

Ich habe die folgende Aussage auf Debian 10 verwendet

apt-get install iputils-ping
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.