Я делал некоторые сложные вещи с докером, но, как оказалось, я не знаю, что -it
означает флаг. Недавно я наткнулся на пример docker run
команды, которая меня немного смутила.
docker run -itd ubuntu:xenial /bin/bash
У меня вопрос: какой смысл -it
здесь писать флаг, если контейнер во время запуска экземпляраbin/bash
В документации есть пример
docker run --name test -it debian
с объяснением
-It указывает Docker выделить псевдо-TTY, подключенный к стандартному вводу контейнера; создание интерактивной оболочки bash в контейнере.
и объяснение флага -t на странице справки
-t, --tty Назначить псевдо-телетайп
если я удалю флаг -it во время
docker run -d ubuntu:xenial /bin/bash
мой недавно созданный контейнер не так уж и жив
в docker ps -a
он обозначен как вышедший
Извините, если мой вопрос довольно глупый, я не могу найти объяснения в Интернете (у меня есть существенное непонимание этого пункта).
источник
/bin/bash
на stdin нет контента, у него нет команд для запуска и нет возможности запрашивать пользователя, поэтому он выходит. Это 100% нормальное и ожидаемое поведение.Ответы:
-it
- это сокращение от того,--interactive + --tty
когда вы используетеdocker run
эту команду ... она приведет вас прямо внутрь контейнера, где-d
это сокращение--detach
означает, что вы просто запускаете контейнер, а затем отсоединяетесь от него, поэтому в основном вы запускаете контейнер в фоновом режиме .. edit: so если вы запустите контейнер докера с-itd
ним, будут запущены-it
параметры и вы отключите вас от контейнера, поэтому ваш контейнер все еще будет работать в фоновом режиме даже без какого-либо приложения по умолчанию для запуска.источник
CMD
по умолчанию не было никакой команды, поэтому по умолчанию он не запускал какое-либо приложение. . поэтому, если вы запустите его в фоновом режиме, он немедленно завершится, потому что у него не было никакой работы. .-i
). Точно так же, если он запускает команды, которые ведут себя по-разному в зависимости от наличия TTY, вы можете получить отличное поведение в зависимости от наличия-t
./bin/bash </dev/null
тоже немедленно закрывается, если вы запустите его без Docker. Запускdocker run
без запуска-i
делает то же самое с запущенной копиейbash
. (Без-t
него у него есть стандартный ввод, но нет TTY, поэтому он не обнаруживает себя как интерактивную оболочку, поэтому вы получаете немного другой набор поведения).docker run -it ubuntu:xenial /bin/bash
запускает контейнер в интерактивном режиме (отсюда-it
флаг), который позволяет вам взаимодействовать с/bin/bash
контейнером. Это означает , что теперь вы будете иметьbash
сеанс внутри контейнера, так что вы можетеls
,mkdir
или делать какую - либо команду Баша внутри контейнера.Ключевым моментом здесь является слово «интерактивный». Если вы опустите флаг, контейнер все равно будет выполняться,
/bin/bash
но немедленно завершится. С флагом контейнер выполняется, а/bin/bash
затем терпеливо ожидает вашего ввода.источник
docker run -i ubuntu:xenial /bin/bash
-t
: псевдо tty, или «псевдотерминал». Без терминала вы не можете отправлять входные данные в контейнер.docker run -it ubuntu:xenial
спасибо за ответ, но у меня тоже будет сеанс терминала с этой командой с нуля (для чего мне тогда нужно запустить bin / bash). Он также создает терминальную сессию-t
тега все еще можно взаимодействовать с контейнером, но с ним у вас будет более приятный терминал с большим количеством функций. Вы можете бегать с-i
и с,-it
чтобы увидеть разницу.