что такое docker run -it flag?

111

Я делал некоторые сложные вещи с докером, но, как оказалось, я не знаю, что -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

он обозначен как вышедший

Извините, если мой вопрос довольно глупый, я не могу найти объяснения в Интернете (у меня есть существенное непонимание этого пункта).

Alex
источник
Если /bin/bashна stdin нет контента, у него нет команд для запуска и нет возможности запрашивать пользователя, поэтому он выходит. Это 100% нормальное и ожидаемое поведение.
Чарльз Даффи
Возможный дубликат параметра Confused about Docker -t для выделения псевдо-TTY
jdhao

Ответы:

99

-it- это сокращение от того, --interactive + --ttyкогда вы используете docker runэту команду ... она приведет вас прямо внутрь контейнера, где -dэто сокращение --detachозначает, что вы просто запускаете контейнер, а затем отсоединяетесь от него, поэтому в основном вы запускаете контейнер в фоновом режиме .. edit: so если вы запустите контейнер докера с -itdним, будут запущены -itпараметры и вы отключите вас от контейнера, поэтому ваш контейнер все еще будет работать в фоновом режиме даже без какого-либо приложения по умолчанию для запуска.

Фенди Джатмико
источник
Это неправильный ответ, потому что мой контейнер останавливается после запуска без опции -it.
Alex
1
это означает, что в вашем контейнере есть ошибка ... значит, ваш контейнер не запускается ... или, возможно, у него CMDпо умолчанию не было никакой команды, поэтому по умолчанию он не запускал какое-либо приложение. . поэтому, если вы запустите его в фоновом режиме, он немедленно завершится, потому что у него не было никакой работы. .
Fendi jatmiko
@Alex, если программа в вашем контейнере является чем-то, что завершается, когда stdin закрыт, вот ваш ответ (относительно того, почему она не будет работать без -i). Точно так же, если он запускает команды, которые ведут себя по-разному в зависимости от наличия TTY, вы можете получить отличное поведение в зависимости от наличия -t.
Чарльз Даффи
@Alex, ... и для ясности, /bin/bash </dev/nullтоже немедленно закрывается, если вы запустите его без Docker. Запуск docker runбез запуска -iделает то же самое с запущенной копией bash. (Без -tнего у него есть стандартный ввод, но нет TTY, поэтому он не обнаруживает себя как интерактивную оболочку, поэтому вы получаете немного другой набор поведения).
Чарльз Даффи
1
@AdmiralAdama, проблему с цветом решает опция -t. TTY необходим для понимания цветных маркеров.
kroiz
43

docker run -it ubuntu:xenial /bin/bashзапускает контейнер в интерактивном режиме (отсюда -itфлаг), который позволяет вам взаимодействовать с /bin/bashконтейнером. Это означает , что теперь вы будете иметь bashсеанс внутри контейнера, так что вы можете ls, mkdirили делать какую - либо команду Баша внутри контейнера.

Ключевым моментом здесь является слово «интерактивный». Если вы опустите флаг, контейнер все равно будет выполняться, /bin/bashно немедленно завершится. С флагом контейнер выполняется, а /bin/bashзатем терпеливо ожидает вашего ввода.

dvnguyen
источник
2
для чего мне тогда нужно использовать флаг -t? docker run -i ubuntu:xenial /bin/bash
Alex
4
-t: псевдо tty, или «псевдотерминал». Без терминала вы не можете отправлять входные данные в контейнер.
dvnguyen
docker run -it ubuntu:xenial спасибо за ответ, но у меня тоже будет сеанс терминала с этой командой с нуля (для чего мне тогда нужно запустить bin / bash). Он также создает терминальную сессию
Alex
2
Ты прав. Я заберу свои слова назад. Без -tтега все еще можно взаимодействовать с контейнером, но с ним у вас будет более приятный терминал с большим количеством функций. Вы можете бегать с -iи с, -itчтобы увидеть разницу.
dvnguyen
Не могу найти отличий. Спасибо за ваши старания!
Alex