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.


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 <name@domain.com>" 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.


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.


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.


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

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>
    

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>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.