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


337

У мене є контейнер Docker під керуванням Ubuntu, який я зробив так:

docker run -it ubuntu /bin/bash

однак, схоже, цього немає ping. Напр

bash: ping: command not found

Чи потрібно мені це встановити?

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


6
Цілком доречно, щоб зображення Докера було мінімальним. У більшості випадків контейнер ніколи нічого не зробить, але запустить одну програму - навіщо встановлювати все, що додатку не потрібно?
Чарльз Даффі

3
Якщо ви просто хочете запустити діагностику, можливо, буде простіше запустити зайнятий ящик (зображення якого включає в себе ping), наприклад: docker run -it - rm busybox ping my-server.
Френсіс Нортон

Відповіді:


688

Зображення Docker є досить мінімальними, але ви можете встановити pingсвоє офіційне зображення докера ubuntu за допомогою:

apt-get update
apt-get install iputils-ping

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

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

Виконувати:

docker commit -m "Installed iputils-ping" --author "Your Name <name@domain.com>" ContainerNameOrId yourrepository/imagename:tag

Докерфайл:

FROM ubuntu
RUN apt-get update && apt-get install -y iputils-ping
CMD bash

Зверніть увагу, що є найкращі практики створення зображень докера, як, наприклад, очищення файлів кеш-файлів після і т.д.


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команди.


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 дозволяє ехо поводитись визначеним способом впровадження, коли він дається -nв якості першого аргументу або коли є будь-які літерали зворотної косої риси, але навіть тоді це визначено реалізацією , не гарантується стандартом, тому поведінка залежить від окремої оболонки у вживанні).
Чарльз Даффі

Дякуємо за коментарі та вдосконалення, дружній приклад "копіювати та вставляти" був більш задумливим.
NikoNyrh

7

Зазвичай люди тягнуть офіційний образ Ubuntu / CentOS, але вони не усвідомлюють, що ці зображення мінімальні і не мають нічого над цим.

Для Ubuntu це зображення побудовано з офіційних тарболів rootfs, наданих Canonical. Зважаючи на те, що це мінімальна установка Ubuntu, це зображення включає лише мови C, C.UTF-8 та POSIX за замовчуванням.

Можна встановити мережеві інструменти (включає 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 "будь-яке описове повідомлення" image_id image_name: lattest

На цьому зображенні буде встановлена ​​вся річ.


6

Крім того, ви можете використовувати зображення Docker, на якому вже встановлено ping, наприклад, зайнятий :

docker run --rm busybox ping SERVER_NAME -c 2

Це рішення, але створювати зображення просто для виконання ping мені здається надмірним. Я вважаю за краще 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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.