co to jest flaga Docker run -it?

111

Robiłem trochę skomplikowanych rzeczy z dockerem, ale okazuje się, że nie wiem, co -itoznacza flaga. Ostatnio natknąłem się na przykład docker runpolecenia, który trochę mnie zdezorientował.

docker run -itd ubuntu:xenial /bin/bash 

Moje pytanie brzmi, jaki sens ma pisać -ittutaj flagę, jeśli kontener jest uruchamiany podczas uruchamiania instancjibin/bash

W dokumentacji mamy przykład

docker run --name test -it debian

z wyjaśnieniem

-It instruuje Docker, aby przydzielił pseudo-TTY podłączony do standardowego wejścia kontenera; tworzenie interaktywnej powłoki bash w kontenerze.

i wyjaśnienie flagi -t ze strony pomocy

-t, --tty Przydziela pseudo-TTY

jeśli usunę flagę -it podczas

docker run -d ubuntu:xenial /bin/bash

mój nowo utworzony kontener nie żyje tak bardzo

w docker ps -a

jest oznaczony jako opuszczony

Przepraszam, jeśli moje pytanie jest dość głupie, nie mogę znaleźć wyjaśnienia w Internecie (mam istotne nieporozumienie w tej kwestii).

Alex
źródło
Jeśli /bin/bashnie ma zawartości dostępnej na stdin, nie ma poleceń do uruchomienia ani możliwości monitowania użytkownika, więc kończy działanie. Jest to w 100% normalne i oczekiwane zachowanie.
Charles Duffy

Odpowiedzi:

99

-itjest skrótem od --interactive + --ttykiedy za docker runpomocą tego polecenia ... zabrałoby cię prosto do kontenera, gdzie -djest skrótem, --detachco oznacza, że ​​po prostu uruchamiasz kontener, a następnie odłączasz się od niego, więc w zasadzie uruchamiasz kontener w tle .. edit: so jeśli uruchomisz z -itdnim kontener docker , uruchomisz -itopcje i odłączysz Cię od kontenera, więc kontener nadal będzie działał w tle, nawet bez żadnej domyślnej aplikacji do uruchomienia.

Fendi jatmiko
źródło
To nie jest dobra odpowiedź, ponieważ mój kontener jest zatrzymywany po uruchomieniu bez opcji -it.
Alex
1
to oznacza, że ​​w Twoim kontenerze jest błąd ... więc Twój kontener nie może się uruchomić ... lub może nie miał CMDdomyślnie żadnego polecenia, więc domyślnie nie uruchamiał żadnej aplikacji. . więc jeśli uruchomisz go w tle, zakończy się natychmiast, ponieważ nie ma żadnego zadania do wykonania. .
Fendi jatmiko
@Alex, jeśli program w twoim kontenerze jest czymś, co kończy się po zamknięciu standardowego wejścia, oto Twoja odpowiedź (dlaczego nie będzie działać bez -i). Podobnie, jeśli uruchamia polecenia, które zachowują się inaczej w zależności od tego, czy istnieje TTY, możesz uzyskać różne zachowanie w zależności od obecności -t.
Charles Duffy
@Alex ... i żeby było jasne, również /bin/bash </dev/nullkończy pracę natychmiast, jeśli uruchomisz go bez Dockera. Bieganie docker runbez -irobi to samo z kopią, na bashktórej się uruchamia. (Bez -ttego ma stdin, ale nie TTY, więc nie wykrywa się jako powłoka interaktywna, więc uzyskujesz nieco inny zestaw zachowań).
Charles Duffy
1
@AdmiralAdama, tym, co rozwiązuje problem z kolorem, jest opcja -t. TTY jest potrzebny do zrozumienia znaczników kolorów.
kroiz
43

docker run -it ubuntu:xenial /bin/bashuruchamia kontener w trybie interaktywnym (stąd -itflaga), który umożliwia interakcję z /bin/bashkontenerem. Oznacza to, że teraz trzeba będzie bashsesja wewnątrz pojemnika, dzięki czemu można ls, mkdiralbo zrobić dowolne polecenie bash wewnątrz pojemnika.

Kluczem jest tutaj słowo „interaktywne”. Jeśli pominiesz flagę, kontener nadal jest wykonywany, /bin/bashale kończy pracę natychmiast. Z flagą kontener wykonuje, /bin/basha następnie cierpliwie czeka na dane wejściowe.

dvnguyen
źródło
2
po co więc potrzebuję użyć flagi -t? docker run -i ubuntu:xenial /bin/bash
Alex
4
-t: pseudo tty lub „pseudoterminal”. Bez terminala nie możesz przesyłać danych wejściowych do kontenera.
dvnguyen
docker run -it ubuntu:xenial dzięki za odpowiedź, ale będę miał sesję terminala z tym poleceniem też od zera (po co muszę wtedy uruchomić bin / bash). Tworzy również sesję terminala
Alex
2
Masz rację. Cofnę swoje słowa. Bez -ttagu można nadal wchodzić w interakcję z kontenerem, ale dzięki niemu będziesz miał ładniejszy, bardziej funkcjonalny terminal. Możesz biegać -izi, -itaby zobaczyć różnicę.
dvnguyen
Nie mogę znaleźć żadnych różnic. Dziękuję za Twój wysiłek!
Alex