Docker запустить Ubuntu / BIN / Bash против Docker запустить Ubuntu

15

Docker версия 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часть как мусор.

Но в любом случае я решил спросить вас: может быть, есть какая-то разница между двумя способами запуска Docker? Если есть, то на что это похоже?

Майкл
источник

Ответы:

11

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

Если пользователь указывает аргументы для, docker runон переопределит значение по умолчанию, указанное в CMD.

Так получилось, что команда по умолчанию, указанная для Ubuntu Dockerfile , на самом деле 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контейнер будет остановлен сразу после запуска. потому что он запускал bash в неинтерактивном режиме, и после его завершения контейнер больше не имеет ничего общего.

Ravexina
источник