docker run ubuntu /bin/bash против docker run ubuntu

docker run ubuntu /bin/bash против docker run ubuntu

Докер версии 17.06.0-ce

Я изучаю Docker по видеокурсу.

Лектор показывает:

sudo docker run -ti ubuntu /bin/bash

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

sudo docker run -ti ubuntu 

и

sudo docker run -ti ubuntu /bin/bash

Для меня нет ни одного. И лектор не акцентирует внимание на команде. Он сказал, что мы просто запускаем docker. Это была его первая команда в курсе. А затем он показывает, что мы изолированы от хостовой машины, мы можем свободно гробить то, что хотим, без какого-либо ущерба (типа 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? Если есть, то в чем она заключается?

решение1

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

решение3

Попробуйте выполнить команду ниже, и вы поймете разницу.

sudo docker run -ti python
sudo docker run -ti python /bin/bash

Связанный контент