Что значит флаги -it в docker run?
Я изучаю докер и не понимаю, что за флаги -i и -t. Везде непонятно пишут или не yделяют особого внимания.
Ответы (1 шт):
-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
Контейнер запустится и тут же завершится. У шелла нет стандартного ввода, нет терминала, поэтому он автоматически завершается.