docker run ubuntu / bin / bash vs docker run ubuntu


15

Версія докера 17.06.0-ce

Я вивчаю Докер, переглядаючи відео-курс.

Лектор показує:

sudo docker run -ti ubuntu /bin/bash

Запустіть докер із зображенням ubuntu. І що мене турбує /bin/bash\. man docker runпоказує, що /bin/bashце команда. Тобто docker run IMAGE [COMMAND]. Ну, це нормально. Але в чому різниця

sudo docker run -ti ubuntu 

і

sudo docker run -ti ubuntu /bin/bash

Для мене такого немає. А лектор не зосереджує уваги на команді. Він сказав, що ми просто запускаємо докер. Це була його перша команда в курсі. А потім він показує, що нас ізолювали від хост-машини, ми можемо безперешкодно зруйнувати те, що хочемо (наприклад, rm -rf / bin).

Я перевірив:

$ sudo docker run -ti ubuntu
root@aaf7cd26fe18:/# echo $SHELL
/bin/bash


$ sudo docker run -ti ubuntu /bin/bash
root@6b2570958216:/# echo $SHELL
/bin/bash

Що ж, для себе я вирішив викинути цю /bin/bashчастину як сміття.

Але все одно я вирішив запитати у вас: можливо, є якась різниця між двома способами запуску Докера? Якщо є, що це таке?

Відповіді:


11

Docker зображення може вказати , що певна команда повинна бути запущена за замовчуванням, використовуючи в CMDдирективу в Dockerfile . І:

Якщо користувач вкаже аргументи, docker runвони замінять типовий параметр, вказаний у CMD.

Як це відбувається, команда за замовчуванням, визначена для Dockerfile Ubuntu, насправді є bash:

CMD ["/bin/bash"]

Отже, для конкретного випадку образ Ubuntu docker run ... ubuntu /bin/bashнічим не відрізняється від docker run ... ubuntu.

Звичайно, це не завжди повинно бути правдою. Dockerfile для двигуна бази даних може запускати команду бази даних за замовчуванням. У такому випадку, якщо вам потрібна була інтерактивна оболонка, вам потрібно буде це зробити docker run ... /bin/bash.

Загалом, ви не можете припустити, що docker runце дасть вам інтерактивну оболонку. Безпечніше вказати, /bin/bashчи потрібна вам оболонка.


2

Якщо ви не надаєте команду, яка у вашому випадку є /bin/bash, під час використання -ti( iінтерактивного, tтермінального) ви будете приєднані до програми за замовчуванням, яка була визначена для виконання під час використання runкоманди в DockerFile.

Наприклад, якщо зображення запускає веб-сервер на передньому плані, то, що ви побачите після використання runбез, /bin/bash- це журнали цього веб-сервера (програма за замовчуванням, яку запустили).

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

У Ubuntu командою за замовчуванням є, bashі якщо ви не надаєте -tiконтейнер, він буде зупинений відразу після запуску. тому що він запустив баш в неінтерактивному режимі, і після його закінчення контейнер більше нічого не має робити.

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