Docker - Ubuntu - bash: ping: nie znaleziono polecenia

337

Mam kontener Docker z systemem Ubuntu, który wykonałem w następujący sposób:

docker run -it ubuntu /bin/bash

jednak wydaje się, że nie ping. Na przykład

bash: ping: command not found

Czy muszę to zainstalować?

Wydaje się, że brakuje dość podstawowego polecenia. Próbowałem, whereis pingktóry niczego nie zgłasza.

Snowcrash
źródło
6
Jest całkowicie właściwe, aby obraz Dockera był minimalny. W większości przypadków kontener nigdy nie zrobi nic poza uruchomieniem jednej aplikacji - po co instalować cokolwiek, czego ta aplikacja nie potrzebuje?
Charles Duffy,
3
Jeśli chcesz po prostu uruchomić diagnostykę, może być prostsze uruchomienie busyboksa (który obraz zawiera ping), np .: docker run -it --rm busybox ping my-server.
Francis Norton

Odpowiedzi:

688

Obrazy pingdokerów są dość minimalne, ale możesz je zainstalować na swoim oficjalnym obrazie dokera ubuntu poprzez:

apt-get update
apt-get install iputils-ping

Możliwe, że nie potrzebujesz pingswojego obrazu, a po prostu chcesz go użyć do celów testowych. Powyższy przykład pomoże ci.

Ale jeśli potrzebujesz pinga, aby istnieć na swoim obrazie, możesz utworzyć kontener Dockerfilelub commitkontener, w którym uruchomiłeś powyższe polecenia do nowego obrazu.

Popełnić:

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

Plik Docker:

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

Pamiętaj, że istnieją najlepsze praktyki tworzenia obrazów dokerów, takie jak czyszczenie plików apt cache po itp.

Farhad Farahi
źródło
apt-get kończy się niepowodzeniem, Temporary failure resolving 'security.ubuntu.com'ponieważ sieci nie ma.
Pavel Niedoba
32

To jest strona Docker Hub dla Ubuntu i to jest, jak to jest tworzony. Ma tylko (nieco) zainstalowane minimum pakiety, więc jeśli potrzebujesz czegoś dodatkowego, musisz go zainstalować samodzielnie.

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

Jednak zwykle tworzysz „plik dokowania” i budujesz go:

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

Skorzystaj z Google, aby znaleźć samouczki i przeglądać istniejące pliki Docker, aby zobaczyć, jak zwykle to robią :) Na przykład rozmiar obrazu należy zminimalizować, uruchamiając apt-get clean && rm -rf /var/lib/apt/lists/*po apt-get installpoleceniach.

NikoNyrh
źródło
echo -efaktycznie przeciwstawia się standardowi sh POSIX , który nie pozwala mu na nic innego niż drukowanie -ena jego wyjściu. (Nawet w przypadku niektórych wersji bash jest to zachowanie domyślne). printfZamiast tego użyj : printf '%s\n' "FROM ubuntu" "RUN apt-get update && apt-get install -y iputils-ping" "CMD bash"i zobacz sekcję UŻYWANIE APLIKACJI w wyżej wymienionym dokumencie standardów.
Charles Duffy,
Nawet bash nie będzie obsługiwał echo -etego, czego oczekujesz (ale zamiast tego będzie działał zgodnie ze standardami), gdy będzie w trybie POSIX skompilowanym --enable-xpg-echo-defaultz odpowiednimi zmiennymi środowiskowymi lub inną konfiguracją środowiska wykonawczego.
Charles Duffy,
(POSIX pozwala echu zachowywać się w sposób zdefiniowany w implementacji, gdy jest podawany -njako pierwszy argument lub gdy występują jakiekolwiek literały odwrotnego ukośnika - ale nawet wtedy, jest to zdefiniowane w implementacji , nie jest gwarantowane w standardach, więc zachowanie zależy od pojedynczej powłoki w użyciu).
Charles Duffy,
Dzięki za komentarze i ulepszenia, przyjazny przykład „kopiuj i wklej” był bardziej przemyślany.
NikoNyrh,
7

Zasadniczo ludzie ściągają oficjalny obraz Ubuntu / CentOS, ale nie zdają sobie sprawy, że te obrazy są minimalne i nie mają nic na wierzchu.

W przypadku Ubuntu ten obraz jest zbudowany z oficjalnych plików tarf rootfs dostarczonych przez Canonical. Ponieważ jest to minimalna instalacja systemu Ubuntu, ten obraz domyślnie zawiera tylko ustawienia narodowe C, C.UTF-8 i POSIX.

Można zainstalować narzędzia sieciowe (w tym ifconfig, netstat), ip-utils (w tym ping) i inne, takie jak curl itp. Na kontenerze i można utworzyć obraz z kontenera lub napisać plik Docker, który zainstaluje te narzędzie podczas tworzenia obrazu.

Poniżej znajduje się przykład Dockerfile, podczas tworzenia obrazu z tego będzie zawierać następujące narzędzia:

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

lub uruchom kontener z obrazu podstawowego i zainstaluj te narzędzia w kontenerze, a następnie zatwierdź obraz. docker commit -m "dowolny komunikat opisowy" identyfikator_kontenera nazwa_obrazu: lattest

Ten obraz będzie miał wszystko zainstalowane.

Vaseem007
źródło
6

Alternatywnie możesz użyć obrazu Docker, który ma już zainstalowany ping, np. Busybox :

docker run --rm busybox ping SERVER_NAME -c 2
Ivan
źródło
To rozwiązanie, ale tworzenie obrazu tylko w celu wykonania polecenia ping wydaje mi się przesadą. Wolę apt-get iputils-pingna obrazie, który tego potrzebuje.
renatoaraujoc
1

Za każdym razem, gdy pojawia się tego rodzaju błąd

bash: <command>: command not found
  • Na hoście z tym poleceniem, które już działa z tym rozwiązaniem :

    dpkg -S $(which <command>)
    
  • Nie masz hosta z tym pakietem? Wypróbuj to :

    apt-file search /bin/<command>
    
Pablo A.
źródło
1

Czasami minimalna instalacja Linuksa w Dockerze nie określa ścieżki i dlatego konieczne jest wywołanie ping przy użyciu ....

cd /usr/sbin
ping <ip>
Alex Javarotti
źródło
0

Użyłem poniższego stwierdzenia w debian 10

apt-get install iputils-ping
Anthony Wambui
źródło