Docker - Ubuntu - bash: ping: команда не найдена

338

У меня есть Docker-контейнер с Ubuntu, который я сделал следующим образом:

docker run -it ubuntu /bin/bash

Однако, похоже, нет ping. Например

bash: ping: command not found

Нужно ли устанавливать это?

Кажется, довольно простая команда отсутствует. Я пытался whereis pingчто ничего не сообщает.

Snowcrash
источник
6
Вполне уместно, чтобы изображение Docker было минимальным. В большинстве случаев контейнер никогда ничего не делает, кроме запуска одного приложения - зачем устанавливать то, что не нужно приложению?
Чарльз Даффи
3
Если вы просто хотите запустить диагностику, может быть проще запустить busybox (в образ которого входит ping), например: docker run -it --rm busybox ping my-server.
Фрэнсис Нортон

Ответы:

689

Образы докеров довольно минимальны, но вы можете установить их pingв свой официальный образ докера Ubuntu через:

apt-get update
apt-get install iputils-ping

Скорее всего, вам не нужно pingваше изображение, и вы просто хотите использовать его для тестирования. Приведенный выше пример поможет вам.

Но если вам нужно, чтобы ping существовал на вашем изображении, вы можете создать Dockerfileили commitконтейнер, в котором вы запускали вышеуказанные команды, для нового изображения.

Commit:

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

Обратите внимание, что существуют рекомендации по созданию образов Docker, такие как очистка файлов apt-кэша после и т. Д.

Фархад Фарахи
источник
apt-get терпит неудачу с Temporary failure resolving 'security.ubuntu.com'очевидно, потому что сеть не присутствует.
Павел Недоба
32

Это страница Docker Hub для Ubuntu и это то , как он будет создан. На нем установлены только (несколько) минимальные пакеты, поэтому, если вам нужно что-то дополнительное, вам нужно установить его самостоятельно.

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

Однако обычно вы создаете Dockerfile и создаете его:

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

Используйте Google , чтобы найти учебники и просматривать существующие Dockerfiles , чтобы увидеть , как они обычно делают вещи :) Для размера Примера изображения должны быть сведены к минимуму путем запуска apt-get clean && rm -rf /var/lib/apt/lists/*после apt-get installкоманды.

NikoNyrh
источник
echo -eфактически игнорирует стандарт POSIX sh , который не позволяет ему ничего делать, кроме печати -eна выходе. (Даже с некоторыми версиями bash это поведение по умолчанию). printfВместо этого используйте :, printf '%s\n' "FROM ubuntu" "RUN apt-get update && apt-get install -y iputils-ping" "CMD bash"и смотрите раздел ИСПОЛЬЗОВАНИЕ ПРИЛОЖЕНИЯ вышеупомянутого документа стандартов.
Чарльз Даффи
Даже bash не будет поддерживать echo -eто, что вы ожидаете (но вместо этого будет вести себя в соответствии со стандартами) в скомпилированном режиме POSIX --enable-xpg-echo-default, с соответствующими переменными среды или другой конфигурацией времени выполнения.
Чарльз Даффи
(POSIX позволяет echo вести себя в соответствии с реализацией, если задан -nв качестве первого аргумента или когда присутствуют какие-либо литералы с обратной косой чертой, но даже в этом случае он определяется реализацией , а не гарантируется стандартом, поэтому поведение зависит от отдельной оболочки в использовании).
Чарльз Даффи
Спасибо за комментарии и улучшения, дружественный пример «копирования и вставки» был скорее послеподуманным.
NikoNyrh
7

Обычно люди тянут официальное изображение Ubuntu / CentOS, но они не понимают, что эти изображения минимальны и не имеют ничего общего с этим.

Для Ubuntu это изображение создано из официальных tarfs rootfs, предоставленных Canonical. Учитывая, что это минимальная установка Ubuntu, этот образ по умолчанию включает только локали C, C.UTF-8 и POSIX.

Можно установить net-tools (включая ifconfig, netstat), ip-utils (включая ping) и другие подобные curl и т. Д. На контейнер и можно создать образ из контейнера или написать Dockerfile, который установит этот инструмент при создании образа.

Ниже приведен пример Dockerfile, при создании изображения из него будут использоваться следующие инструменты:

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

или запустите контейнер из базового образа и установите эти утилиты в контейнер, а затем передайте его в образ. docker commit -m "любое описательное сообщение" container_id image_name: lattest

В этом образе будет установлено все.

Vaseem007
источник
6

В качестве альтернативы вы можете использовать образ Docker, на котором уже установлен ping, например busybox :

docker run --rm busybox ping SERVER_NAME -c 2
Иван
источник
Это решение, но создание образа только для выполнения пинга кажется мне излишним. Я бы предпочел apt-get iputils-pingизображение, которое нуждается в этом.
Renatoaraujoc
1

Каждый раз, когда вы получаете такую ​​ошибку

bash: <command>: command not found
  • На хосте с этой командой, уже работающей с этим решением :

    dpkg -S $(which <command>)
    
  • У вас нет хоста с установленным пакетом? Попробуйте это :

    apt-file search /bin/<command>
    
Пабло А
источник
1

Иногда минимальная установка Linux в Docker не определяет путь, и поэтому необходимо вызывать ping, используя ....

cd /usr/sbin
ping <ip>
Алекс Джаваротти
источник
0

Я использовал приведенное ниже утверждение о Debian 10

apt-get install iputils-ping
Энтони Вамбуи
источник