
Докер версии 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