Что значит флаги -it в docker run?

Я изучаю докер и не понимаю, что за флаги -i и -t. Везде непонятно пишут или не yделяют особого внимания.


Ответы (1 шт):

Автор решения: Pak Uula

-i или --interactive означает, что запускаемый контейнер получает стандартный поток ввода из хоста и перенаправляет его в запущенное приложение. По-умолчанию контейнеры стартуют изолированно, и /dev/stdin запущенного приложения не имеет связи с внешним миром.

-t или --tty означает, что докер создаёт для запущенного приложения псевдотерминал. Это позволяет приложению выводить цветной текст, перемещать курсор (точку вывода) по экрану консоли и много чего ещё.

ПРИМЕР

Попробуем запускать шелл /bin/sh с разными комбинациями -it.

-i -t

docker run --rm -i -t alpine /bin/sh

В консоли запустится шелл и напечатает промт / #

Напишите команду ls и нажмите ввод.

Получится что-то такое:

bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var

Каталоги выведены в одну строку и раскрашены синим цветом.

-t

Запустите без -i:

docker run --rm -t alpine /bin/sh

Контейнер запустится, шелл напечатает промт / #

Попробуйте запустить команду ls: напечатайте ls и нажмите ввод. И что? И ничего. Без флага -i процесс из контейнера не видит, что вы печатаете в консоли. Контейнер создаст для /bin/sh стандартный поток ввода, но этот поток никак не связан с консолью, откуда вы контейнер запустили.

-i

Запустим без -t:

docker run --rm -i alpine /bin/sh

Процесс запустится, но промт не напечатает. Просто пустая строка.

Напечатайте команду ls и нажмите ввод. Благодаря флагу -i шелл увидит эту команду и обработает её, выдав список каталогов на стандартный вывод.

bin
dev
...
var

Вывод в колонку и без цвета. Причина - без терминала шелл не может передвигать курсор в строке, чтобы печатать каталоги в одной строке, и не может управлять цветом. Этим же объясняется отсуствие промта / # - без терминала нет редактирования строки, шелл принимает на вход команды и выдаёт их результат на выход.

без всего

docker run --rm alpine /bin/sh

Контейнер запустится и тут же завершится. У шелла нет стандартного ввода, нет терминала, поэтому он автоматически завершается.

→ Ссылка