Robiłem trochę skomplikowanych rzeczy z dockerem, ale okazuje się, że nie wiem, co -it
oznacza flaga. Ostatnio natknąłem się na przykład docker run
polecenia, który trochę mnie zdezorientował.
docker run -itd ubuntu:xenial /bin/bash
Moje pytanie brzmi, jaki sens ma pisać -it
tutaj 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).
źródło
/bin/bash
nie 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.Odpowiedzi:
-it
jest skrótem od--interactive + --tty
kiedy zadocker run
pomocą tego polecenia ... zabrałoby cię prosto do kontenera, gdzie-d
jest skrótem,--detach
co 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-itd
nim kontener docker , uruchomisz-it
opcje i odłączysz Cię od kontenera, więc kontener nadal będzie działał w tle, nawet bez żadnej domyślnej aplikacji do uruchomienia.źródło
CMD
domyś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. .-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
./bin/bash </dev/null
kończy pracę natychmiast, jeśli uruchomisz go bez Dockera. Bieganiedocker run
bez-i
robi to samo z kopią, nabash
której się uruchamia. (Bez-t
tego ma stdin, ale nie TTY, więc nie wykrywa się jako powłoka interaktywna, więc uzyskujesz nieco inny zestaw zachowań).docker run -it ubuntu:xenial /bin/bash
uruchamia kontener w trybie interaktywnym (stąd-it
flaga), który umożliwia interakcję z/bin/bash
kontenerem. Oznacza to, że teraz trzeba będziebash
sesja wewnątrz pojemnika, dzięki czemu możnals
,mkdir
albo zrobić dowolne polecenie bash wewnątrz pojemnika.Kluczem jest tutaj słowo „interaktywne”. Jeśli pominiesz flagę, kontener nadal jest wykonywany,
/bin/bash
ale kończy pracę natychmiast. Z flagą kontener wykonuje,/bin/bash
a następnie cierpliwie czeka na dane wejściowe.źródło
docker run -i ubuntu:xenial /bin/bash
-t
: pseudo tty lub „pseudoterminal”. Bez terminala nie możesz przesyłać danych wejściowych do kontenera.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-t
tagu można nadal wchodzić w interakcję z kontenerem, ale dzięki niemu będziesz miał ładniejszy, bardziej funkcjonalny terminal. Możesz biegać-i
zi,-it
aby zobaczyć różnicę.