Docker - Ubuntu - bash: ping: comando não encontrado

338

Eu tenho um contêiner Docker executando o Ubuntu, que fiz da seguinte maneira:

docker run -it ubuntu /bin/bash

no entanto, parece não ter ping. Por exemplo

bash: ping: command not found

Preciso instalar isso?

Parece estar faltando um comando bastante básico. Eu tentei o whereis pingque não informa nada.

Snowcrash
fonte
6
É totalmente apropriado que uma imagem do Docker seja mínima. Na maioria dos casos, um contêiner nunca fará nada além de executar um único aplicativo - por que instalar qualquer coisa que o aplicativo não precise?
Charles Duffy
3
Se você simplesmente deseja executar diagnósticos, pode ser mais simples executar o busybox (cuja imagem inclui ping), por exemplo: docker run -it --rm busybox ping meu servidor.
Francis Norton

Respostas:

689

As imagens do Docker são mínimas, mas você pode instalar pingna sua imagem oficial do ubuntu via:

apt-get update
apt-get install iputils-ping

Provavelmente, você não precisa da pingsua imagem e só quer usá-la para fins de teste. O exemplo acima irá ajudá-lo.

Mas se você precisar que o ping exista na sua imagem, poderá criar um Dockerfileou commito contêiner em que os comandos acima foram executados para uma nova imagem.

Confirmar:

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

Observe que existem práticas recomendadas para criar imagens de janela de encaixe, como limpar arquivos de cache apt após e etc.

Farhad Farahi
fonte
O apt-get falha com Temporary failure resolving 'security.ubuntu.com'obviamente porque a rede não está presente.
Pavel Niedoba 30/07/19
32

Esta é a página Docker Hub para o Ubuntu e esta é a forma como ele é criado. Ele possui apenas um pouco (mínimo) de pacotes mínimos instalados; portanto, se você precisar de algo extra, precisará instalá-lo.

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

No entanto, geralmente você cria um "Dockerfile" e o compila:

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

Por favor, use o Google para encontrar tutoriais e Dockerfiles existentes em Procurar para ver como eles costumam fazer coisas :) Para o tamanho exemplo de imagem deve ser minimizado através da execução apt-get clean && rm -rf /var/lib/apt/lists/*após apt-get installcomandos.

NikoNyrh
fonte
echo -ena verdade desafia o padrão POSIX sh , que não permite que ele faça nada além de imprimir -eem sua saída. (Mesmo com algumas versões do bash, esse é o comportamento padrão). Use printf:: printf '%s\n' "FROM ubuntu" "RUN apt-get update && apt-get install -y iputils-ping" "CMD bash"e consulte a seção USO DO APLICATIVO do documento de normas vinculado acima.
Charles Duffy
Mesmo o bash não suporta echo -eda maneira que você espera (mas, em vez disso, terá um comportamento compatível com os padrões) quando estiver no modo POSIX compilado --enable-xpg-echo-defaultou com variáveis ​​de ambiente apropriadas ou outra configuração de tempo de execução.
Charles Duffy
(O POSIX permite que o eco se comporte de uma maneira definida pela implementação quando fornecido -ncomo primeiro argumento ou quando houver literais de barra invertida - mas mesmo assim, é definido pela implementação , não é garantido por padrão, portanto o comportamento depende do shell individual em uso).
Charles Duffy
Obrigado por comentários e melhorias, o exemplo amigável "copiar e colar" foi mais um pensamento tardio.
NikoNyrh 06/10
7

Geralmente, as pessoas puxam a imagem oficial do Ubuntu / CentOS, mas não percebem que essas imagens são mínimas e não têm nada além disso.

Para o Ubuntu, esta imagem foi criada a partir de tarballs rootfs oficiais fornecidos pela Canonical. Dado que é uma instalação mínima do Ubuntu, esta imagem inclui apenas os códigos de idioma C, C.UTF-8 e POSIX por padrão.

Pode-se instalar o net-tools (inclui ifconfig, netstat), ip-utils (inclui ping) e outros curtimentos, etc. enrolam-se no contêiner e podem criar imagens a partir do contêiner ou escrever Dockerfile que instalará essas ferramentas ao criar a imagem.

Abaixo está um exemplo do Dockerfile, ao criar uma imagem a partir disso, ele incluirá estas ferramentas:

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 inicie o contêiner a partir da imagem base e instale esses utilitários no contêiner e depois confirme a imagem. docker commit -m "qualquer mensagem descritiva" container_id image_name: lattest

Essa imagem terá tudo instalado.

Vaseem007
fonte
6

Como alternativa, você pode usar uma imagem do Docker que já possui ping instalado, por exemplo, busybox :

docker run --rm busybox ping SERVER_NAME -c 2
Ivan
fonte
É uma solução, mas criar uma imagem apenas para executar ping parece um exagero para mim. Eu prefiro apt-get iputils-pinga imagem que precisa.
Renatoaraujoc 23/11
1

Toda vez que você receber esse tipo de erro

bash: <command>: command not found
  • Em um host com esse comando já trabalhando com esta solução :

    dpkg -S $(which <command>)
    
  • Não tem um host com esse pacote instalado? Tente o seguinte :

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

Às vezes, a instalação mínima do Linux no Docker não define o caminho e, portanto, é necessário chamar o ping usando ....

cd /usr/sbin
ping <ip>
Alex Javarotti
fonte
0

Eu usei a instrução abaixo no debian 10

apt-get install iputils-ping
Anthony Wambui
fonte