що таке прапор docker run -it?


108

Я робив деякі складні речі з докером, але, як виявилося, я не знаю, що -itозначає прапор. Нещодавно я натрапив на якийсь приклад docker runкоманди, який мене трохи збентежив.

docker run -itd ubuntu:xenial /bin/bash 

Моє питання полягає в тому, який сенс писати -itтут прапор, якщо контейнер під час запуску екземпляра запускаєтьсяbin/bash

У документації ми маємо приклад

docker run --name test -it debian

з поясненням

-It вказує Docker виділити псевдо-TTY, підключений до stdin контейнера; створення інтерактивної оболонки bash у контейнері.

та пояснення прапора -t на сторінці довідки

-t, --tty Виділити псевдо-TTY

якщо я видалю прапор -it під час

docker run -d ubuntu:xenial /bin/bash

мій нещодавно створений контейнер не так багато живе

в docker ps -a

він позначається як вийшов

Вибачте, якщо моє запитання досить дурне, я не можу знайти пояснення в Інтернеті (у мене є суттєве нерозуміння цього питання).


Якщо /bin/bashна stdin немає вмісту, він не має команд для запуску та жодного способу запросити користувача, тому він виходить. Це 100% нормальна та очікувана поведінка.
Чарльз Даффі,

Відповіді:


97

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


Це неправильна відповідь, оскільки мій контейнер зупиняється після запуску без опції -it.
Олексій

1
це означає, що у вашому контейнері є помилка .. тому ваш контейнер не вдалося запустити ... або, можливо, він не мав жодної CMDкоманди за замовчуванням ,, тому він не запускав жодну програму за замовчуванням. . отже, якщо ви запускаєте його у фоновому режимі, він негайно вийде з ладу, оскільки він не повинен був робити жодної роботи. .
Fendi jatmiko

@Alex, якщо програма у вашому контейнері щось закриває, коли stdin закритий, є ваша відповідь (щодо того, чому він не працюватиме без -i). Подібним чином, якщо він запускає команди, які поводяться по-різному залежно від того, чи є TTY, ви можете отримати різну поведінку залежно від присутності -t.
Чарльз Даффі,

@Alex, ... і, щоб бути зрозумілим, також /bin/bash </dev/nullвиходить негайно, якщо запустити його без Docker. Запуск docker runбез -iробить те саме, що і для копії, bashяку він починає. (Без -tнього він має stdin, але не TTY, тому він не виявляє себе як інтерактивну оболонку, тому ви отримуєте дещо інший набір поведінки).
Чарльз Даффі

1
@AdmiralAdama, що вирішує проблему з кольором, це опція -t. TTY необхідний, щоб зрозуміти кольорові маркери.
kroiz

42

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

Ключовим тут є слово "інтерактив". Якщо пропустити прапор, контейнер все одно виконується, /bin/bashале негайно виходить із системи. З прапором контейнер виконується, /bin/bashтоді терпляче чекає вашого введення.


1
для чого мені тоді потрібно використовувати прапор -t? docker run -i ubuntu:xenial /bin/bash
Олексій

3
-t: псевдо tty, або "псевдотермінал". Без терміналу ви не можете надсилати вхідні дані в контейнер.
dvnguyen

docker run -it ubuntu:xenial дякую за відповідь, але у мене також буде сесія терміналу з цією командою з нуля (для чого мені потрібно запустити bin / bash). Це також створить сеанс терміналу
Олексій

1
Ти правий. Я поверну свої слова назад. Без -tтегу все одно можна взаємодіяти з контейнером, але з ним у вас буде приємніший термінал із додатковими функціями. Ви можете бігати з -iі з, -itщоб побачити різницю.
dvnguyen

Я не можу знайти ніяких відмінностей. Дякуємо за Ваші зусилля!
Олексій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.