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

166

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

docker run -it ubuntu /bin/bash

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

bash: ping: command not found

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

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

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

5 ответов

334
Лучший ответ

Изображения Docker довольно минимальны, но вы можете установить 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

Обратите внимание, что есть рекомендации по созданию изображений докеров, например, очистка файлов кэша apt после и т.д.

  • 0
    @AndyHayden Я только что проверил с ubuntu: 16.04 и ubuntu: latest из библиотеки, и apt и apt-get существуют как на изображениях, так и на работах по завершению вкладок. Обратите внимание, что я использую официальные (библиотечные) изображения. Другое дело: если вы можете использовать команду в Dockerfile, вы наверняка можете использовать ее в оболочке, если не удалите ее позже в Dockerfile.
  • 0
    @AndyHayden Рад слышать.
18

Это страница 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, чтобы найти учебники и просмотреть существующие файлы Docker, чтобы увидеть, как они обычно работают :) Например, размер изображения должен быть минимизирован с помощью команды apt-get clean && rm -rf/var/lib/apt/lists/* после apt-get install команды apt-get install.

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

Обычно люди тянут официальное изображение 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

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

1

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

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

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

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

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

    apt-file search /bin/<command>
    
Сообщество Overcoder
Наверх
Меню