-t
Opcja idzie jak Unix / Linux obsługuje dostęp do terminalu. W przeszłości terminal był połączeniem stacjonarnym, później połączeniem modemowym. Miały one fizyczne sterowniki urządzeń (były to prawdziwe urządzenia). Po uruchomieniu sieci uogólnionych opracowano sterownik pseudoterminalowy. Wynika to z tego, że tworzy on rozróżnienie między zrozumieniem, jakie możliwości terminala można wykorzystać bez potrzeby bezpośredniego zapisywania go w programie (czytaj strony podręcznika na stty
,curses
).
Tak więc, mając to jako tło, uruchom kontener bez opcji i domyślnie masz standardowy strumień (tak docker run | <cmd>
działa); uruchom z -i
, a otrzymasz dodany strumień stdin (tak <cmd> | docker run -i
działa); używaj -t
, zwykle w kombinacji -it
i masz dodany sterownik terminalu, który prawdopodobnie wchodzi w interakcję z procesem. Zasadniczo sprawia, że kontener zaczyna wyglądać jak sesja połączenia terminala.
-it
flag.docker run -i ubuntu
adocker run -it ubuntu
zobaczysz różnicę natychmiast. „-i” pozwala zmusić kontener do oczekiwania na interakcję z hosta, ale faktyczna interakcja z konsoli (terminala) jest możliwa po „przydzieleniu sterownika tty” z flagą „-t”.-t
, ale nie mogę modyfikować komendy uruchamiania dokera w środowisku produkcyjnym. Muszę więc sprawić, by aplikacja zaczęła myśleć-t
.Późna odpowiedź, ale może komuś pomóc
docker run/exec -i
połączy STDIN polecenia wewnątrz kontenera z STDINdocker run/exec
samego.Więc
docker run -i alpine cat
daje pustą linię czekającą na dane wejściowe. Wpisz „cześć”, otrzymasz echo „cześć”. Kontener nie zostanie zamknięty, dopóki nie wyślesz CTRL+, Dponieważ główny procescat
czeka na dane wejściowe ze strumienia nieskończonego, który jest wejściem końcowym plikudocker run
.echo "hello" | docker run -i alpine cat
wypisuje „cześć” i kończy natychmiast, ponieważcat
zauważa, że strumień wejściowy zakończył się i sam się zakończył.Jeśli spróbujesz
docker ps
po wyjściu z jednego z powyższych, nie znajdziesz żadnych uruchomionych kontenerów. W obu przypadkachcat
samo się zakończyło, więc doker zakończył kontener.Teraz dla „-t” mówi to głównemu procesowi wewnątrz dokera, że jego wejście jest urządzeniem końcowym.
Więc
docker run -t alpine cat
da ci pustą linię, ale jeśli spróbujesz wpisać „cześć”, nie dostaniesz żadnego echa. Wynika to z faktu, że chociażcat
jest on podłączony do wejścia terminala, to wejście nie jest podłączone do twojego wejścia. Wpisane słowo „cześć” nie dotarło do wejściacat
.cat
czeka na dane wejściowe, które nigdy nie docierają.echo "hello" | docker run -t alpine cat
da ci również pustą linię i nie opuści kontenera CTRL- Dale nie dostaniesz echa „cześć”, ponieważ nie przeszedłeś-i
Jeśli wyślesz CTRL+ C, odzyskasz swoją powłokę, ale jeśli spróbujesz
docker ps
teraz, zobaczysz, żecat
kontener nadal działa. Jest tak, ponieważcat
wciąż czeka na strumień wejściowy, który nigdy nie został zamknięty. Nie znalazłem żadnego przydatnego zastosowania dla-t
samego bez połączenia-i
.Teraz
-it
razem. Mówi to kotowi, że jego wejściem jest terminal i jednocześnie podłącz ten terminal do wejścia,docker run
którego terminalem jest.docker run/exec
upewni się, że jego dane wejściowe są w rzeczywistości tty przed przekazaniem gocat
. Dlatego dostaniesz a,input device is not a TTY
jeśli spróbujesz,echo "hello" | docker run -it alpine cat
ponieważ w tym przypadku wejściemdocker run
jest potok z poprzedniego echa, a nie terminal, w którymdocker run
jest wykonywanyNa koniec, dlaczego musiałbyś zdać,
-t
jeśli-i
podołasz, aby połączyć swój wkład zcat
wejściem? Jest tak, ponieważ polecenia traktują dane wejściowe inaczej, jeśli jest to terminal. Najlepiej ilustruje to również przykładdocker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -u root -p
wyświetli monit o hasło. Jeśli wpiszesz hasło, znaki zostaną wydrukowane w widoczny sposób.docker run -i alpine sh
da ci pustą linię. Jeśli wpiszesz polecenie, tak jakls
otrzymasz wynik, ale nie pojawi się monit lub kolorowe wyjście.W dwóch ostatnich przypadkach, masz ten problem, bo
mysql
jakshell
nie traktowali jako wejście tty, a zatem nie używać tty specyficzne zachowanie jak maskowanie wejścia lub kolorowania wyjście.źródło
-t
i jakie-i
opcje!Według
-t
wyszukiwarki Google argument NIE jest dobrze udokumentowany ani często wymieniany przez wiele osób.Nie pojawia się nawet, gdy wyświetlasz listę (co powinno być) wszystkich argumentów klienta dokera, pisząc
docker
w wierszu polecenia Bash (w najnowszej wersji 1.8.1).W rzeczywistości, jeśli spróbujesz uzyskać konkretną pomoc na temat tego argumentu, pisząc,
docker -t --help
jeśli daje niesamowicie niejasną odpowiedź:Nie możesz więc winić za to, że pomyliłeś się co do tego argumentu!
W dokumentacji online Dockera znajduje się wzmianka, że jest to „Przydziel pseudo-tty” i jest często używane z
-i
:https://docs.docker.com/reference/run/
Widziałem go w dokumentacji wspaniałego
jwilder/nginx-proxy
kontenera dokerów w następujący sposób:W tym przypadku wysyła dane wyjściowe do „wirtualnego” tty (wiersz poleceń / terminal Bash) w tym kontenerze dokera. Następnie możesz wyświetlić ten wynik, uruchamiając polecenie dokera,
docker logs CONTAINER
gdzieCONTAINER
jest pierwsza para znaków identyfikatora tego kontenera. Ten identyfikator KONTENERA można znaleźć, piszącdocker ps -a
Widziałem ten
-t
argument krótko wspomniany w poniższym linku, w którym jest on podanyhttps://coreos.com/os/docs/latest/getting-started-with-docker.html
Mam nadzieję, że to pomoże! Nie jestem pewien, dlaczego nie jest to często udokumentowane lub używane. Być może jest to eksperymentalne i zostanie zaimplementowane jako udokumentowana funkcja w nadchodzących wersjach.
źródło
docker run --help
, a niedocker -t --help
:-t, --tty=false Allocate a pseudo-TTY
”Co wiem o
-t
co następuje:docker exec -ti CONTAINER bash
- pozwala mi „zalogować się” w kontenerze. Czuje się jak ssh -ing (nie jest).Problem polegał na tym, że chciałem przywrócić bazę danych.
Zwykle tak
docker exec -ti mysql.5.7 mysql
- tutaj polecenie mysql w kontenerze i otrzymuję interaktywny terminal.Dodałem
<dump.sql
do poprzedniego polecenia, aby móc przywrócić bazę danych. Ale nie udało sięcannot enable tty mode on non tty input
.Usuwanie
-t
pomógł. Nadal nie rozumiem, dlaczego:Ostatni działa. Mam nadzieję, że to pomaga ludziom.
źródło
-t
, ale nie mogę modyfikować komendy uruchamiania dokera w środowisku produkcyjnym. Muszę więc sprawić, by aplikacja zaczęła myśleć-t
.W Linuksie po uruchomieniu polecenia potrzebny jest terminal (tty), aby go wykonać.
Więc jeśli chcesz połączyć się z dokerem (lub uruchomić polecenie w kontenerze dokera), musisz podać opcję -t, która bierze pod uwagę terminal wewnątrz kontenera dokera.
źródło
Każdy proces ma trzy strumienie danych, tj
STDIN/ STDOUT/ STDERR
. Gdy proces działa w kontenerze, domyślnie terminal jest połączony ze strumieniem STDOUT procesu działającego w kontenerze. Dlatego wszystkie strumienie wyjściowe będą widoczne podczas uruchamianiadocker run
polecenia w terminalu. Ale jeśli chcesz wprowadzić dane wejściowe do uruchomionego procesu w kontenerze, musisz połączyć się z kanałem STDIN procesu, który nie jest domyślnie i jest wykonywany zdocker run -i
polecenia.-t
służy do interaktywnych / sformatowanych operacji wprowadzania.źródło
-it
Instruuje dokowanym przydzielić pseudo-TTY podłączony do standardowego wejścia pojemnika, tworząc powłokę interaktywną wybić otwór pojemnika.--interactive
,-i
false
STDIN powinien być otwarty, nawet jeśli nie jest podłączony--tty
,-t
false
Przydziel pseudo-TTYhttps://docs.docker.com/engine/reference/commandline/run/
źródło