что такое 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

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

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


Если /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затем терпеливо ожидает вашего ввода.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.