Docker - Ubuntu - bash: ping: comando non trovato


338

Ho un contenitore Docker con Ubuntu che ho fatto come segue:

docker run -it ubuntu /bin/bash

tuttavia non sembra avere ping. Per esempio

bash: ping: command not found

Devo installarlo?

Sembra che manchi un comando piuttosto semplice. Ho provato whereis pingche non segnala nulla.


6
È assolutamente appropriato che un'immagine Docker sia minima. Nella maggior parte dei casi, un contenitore non farà mai altro che eseguire una singola applicazione: perché installare tutto ciò di cui l'applicazione non ha bisogno?
Charles Duffy,

3
Se si desidera semplicemente eseguire la diagnostica, potrebbe essere più semplice eseguire busybox (la cui immagine include ping), ad esempio: docker run -it --rm busybox ping my-server.
Francis Norton,

Risposte:


689

Le immagini docker sono piuttosto minime, ma è possibile installarle pingnell'immagine docker ubuntu ufficiale tramite:

apt-get update
apt-get install iputils-ping

È probabile che tu non abbia bisogno della pingtua immagine e desideri utilizzarla solo a scopo di test. L'esempio sopra ti aiuterà.

Ma se hai bisogno di ping per esistere sulla tua immagine, puoi creare uno Dockerfileo commitil contenitore in cui hai eseguito i comandi sopra in una nuova immagine.

Commettere:

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

Si prega di notare che ci sono le migliori pratiche per la creazione di immagini docker, come cancellare i file della cache apt dopo e ecc.


apt-get fallisce Temporary failure resolving 'security.ubuntu.com'ovviamente perché la rete non è presente.
Pavel Niedoba,

32

Questa è la pagina Docker Hub per Ubuntu e questo è come viene creato. Ha solo (un po ') pacchetti minimi nudi installati, quindi se hai bisogno di qualcosa in più devi installarlo da solo.

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

Comunque di solito creeresti un "Dockerfile" e lo costruirai:

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

Si prega di utilizzare Google per trovare tutorial e sfogliare Dockerfiles esistenti per vedere come fanno di solito le cose :) Per esempio dimensione dell'immagine dovrebbe essere ridotto al minimo eseguendo apt-get clean && rm -rf /var/lib/apt/lists/*dopo apt-get installi comandi.


echo -ein realtà sfida lo standard sh POSIX , che non gli consente di fare altro che stampare -esul suo output. (Anche con alcune versioni di bash, questo è il comportamento predefinito). Utilizzare printfinvece printf '%s\n' "FROM ubuntu" "RUN apt-get update && apt-get install -y iputils-ping" "CMD bash":, e consultare la sezione USO DELL'APPLICAZIONE del documento sugli standard sopra collegato.
Charles Duffy,

Anche bash non supporterà echo -eil modo in cui ti aspetti (ma avrà invece un comportamento conforme agli standard) quando in modalità POSIX compilato --enable-xpg-echo-default, o con variabili d'ambiente appropriate o altre configurazioni di runtime.
Charles Duffy,

(POSIX consente all'eco di comportarsi in un modo definito dall'implementazione quando viene dato -ncome primo argomento o quando sono presenti valori letterali di barra rovesciata, ma anche in questo caso è definito dall'implementazione , non garantito dallo standard, quindi il comportamento dipende dalla singola shell in uso).
Charles Duffy,

Grazie per commenti e miglioramenti, l'esempio amichevole "copia e incolla" è stato più che altro un ripensamento.
NikoNyrh,

7

Generalmente le persone estraggono l'immagine ufficiale di Ubuntu / CentOS ma non si rendono conto che queste immagini sono minime e non hanno nulla in più.

Per Ubuntu, questa immagine è costruita con tarballs rootfs ufficiali forniti da Canonical. Dato che si tratta di un'installazione minima di Ubuntu, questa immagine include solo le impostazioni locali C, C.UTF-8 e POSIX per impostazione predefinita.

È possibile installare net-tools (include ifconfig, netstat), ip-utils (include ping) e altri Mi piace ad arricciare ecc. Sul contenitore e può creare un'immagine dal contenitore o scrivere Dockerfile che installerà questi strumenti durante la creazione dell'immagine.

Di seguito è riportato l'esempio Dockerfile, durante la creazione dell'immagine da questo includerà questi strumenti:

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

oppure avvia il contenitore dall'immagine di base e installa queste utilità sul contenitore, quindi esegui il commit sull'immagine. docker commit -m "qualsiasi messaggio descrittivo" container_id nome_immagine: lattest

Quell'immagine avrà tutto installato.


6

In alternativa è possibile utilizzare un'immagine Docker su cui è già installato il ping, ad esempio busybox :

docker run --rm busybox ping SERVER_NAME -c 2

È una soluzione, ma creare un'immagine solo per eseguire il ping mi sembra eccessivo. Preferirei apt-get iputils-pingl'immagine che ne ha bisogno.
renatoaraujoc,

1

Ogni volta che ricevi questo tipo di errore

bash: <command>: command not found
  • Su un host con quel comando già funzionante con questa soluzione :

    dpkg -S $(which <command>)
    
  • Non hai un host con quel pacchetto installato? Prova questo :

    apt-file search /bin/<command>
    

1

A volte, l'installazione minima di Linux in Docker non definisce il percorso e quindi è necessario chiamare ping usando ....

cd /usr/sbin
ping <ip>

0

Ho usato la seguente dichiarazione su debian 10

apt-get install iputils-ping
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.