cos'è il docker run -it flag?


111

Stavo facendo alcune cose complesse con docker, ma a quanto pare non so cosa -itsignifichi flag. Recentemente mi sono imbattuto in qualche esempio di docker runcomando che mi ha un po 'confuso.

docker run -itd ubuntu:xenial /bin/bash 

La mia domanda è: cosa ha senso scrivere -itflag qui, se il contenitore durante l'istanza viene eseguitobin/bash

Nella documentazione abbiamo un esempio

docker run --name test -it debian

con spiegazione

-It indica a Docker di allocare uno pseudo-TTY connesso allo stdin del contenitore; creando una bash shell interattiva nel contenitore.

e spiegazione per il flag -t dalla pagina di aiuto

-t, --tty Assegna uno pseudo-TTY

se elimino -it flag durante

docker run -d ubuntu:xenial /bin/bash

il mio contenitore appena creato non vive così tanto

nel docker ps -a

è designato come uscito

Scusa, se la mia domanda è abbastanza stupida, non riesco a trovare spiegazioni su Internet (ho un significativo fraintendimento su questo punto).


Se /bin/bashnon ha contenuto disponibile su stdin, non ha comandi da eseguire e nessun modo per richiedere all'utente, quindi esce. Questo è un comportamento normale e previsto al 100%.
Charles Duffy

Risposte:


99

-itè l'abbreviazione di --interactive + --ttyquando tu docker runcon questo comando .. ti porterebbe direttamente all'interno del contenitore, dove -dè l'abbreviazione di --detachsignifica che devi solo eseguire il contenitore e poi scollegarti da esso quindi fondamentalmente esegui il contenitore in background .. modifica: quindi se esegui docker container con -itdesso, eseguirai le -itopzioni e ti scollegherà dal container, quindi il tuo container sarà ancora in esecuzione in background anche senza alcuna app predefinita da eseguire.


Non è la risposta giusta, perché il mio contenitore viene arrestato dopo essere stato eseguito senza l'opzione -it.
Alex

1
ciò significa che c'è un errore nel tuo contenitore .. quindi il tuo contenitore non è riuscito ad avviarsi ... o forse non aveva alcun CMDcomando per impostazione predefinita, quindi non ha eseguito alcuna app per impostazione predefinita. .so se lo esegui in background, uscirà immediatamente perché non aveva alcun lavoro da fare. .
Fendi jatmiko

@Alex, se il programma nel tuo contenitore è qualcosa che esce quando lo stdin è chiuso, c'è la tua risposta (sul motivo per cui non verrà eseguito senza -i). Allo stesso modo, se esegue comandi che si comportano in modo diverso in base alla presenza o meno di un TTY, puoi ottenere un comportamento distinto a seconda della presenza di -t.
Charles Duffy

@Alex, ... e per essere chiari, /bin/bash </dev/nullesce immediatamente anche se lo esegui senza Docker. Correre docker runsenza -ista facendo la stessa cosa alla copia di bashquello che inizia. (Senza -t, ha uno stdin ma non un TTY, quindi non si rileva come una shell interattiva, quindi si ottiene un insieme di comportamenti leggermente diverso).
Charles Duffy

1
@AdmiralAdama, ciò che risolve il problema del colore è l'opzione -t. TTY è necessario per comprendere i segnalini colore.
kroiz

43

docker run -it ubuntu:xenial /bin/bashavvia il container in modalità interattiva (da qui -itflag) che permette di interagire con /bin/bashdel container. Questo significa che ora si avrà bashsessione all'interno del contenitore, in modo da poter ls, mkdiro fare qualsiasi comando bash all'interno del contenitore.

La chiave qui è la parola "interattivo". Se ometti il ​​flag, il contenitore viene comunque eseguito /bin/bashma esce immediatamente. Con il flag, il contenitore viene eseguito, /bin/bashquindi attende pazientemente il tuo input.


2
per cosa devo usare -t flag allora? docker run -i ubuntu:xenial /bin/bash
Alex

4
-t: pseudo tty, o "pseudo terminale". Senza un terminale, non è possibile inviare input al contenitore.
dvnguyen

docker run -it ubuntu:xenial grazie per la risposta, ma avrò anche una sessione terminale con questo comando da zero (per quello che mi serve per eseguire bin / bash quindi). Crea anche una sessione terminale
Alex

2
Hai ragione. Riprenderò le mie parole. Senza -ttag si può ancora interagire con il contenitore, ma con esso avrai un terminale più bello e con più funzionalità. Puoi correre con -ie con -itper vedere la differenza.
dvnguyen

Non riesco a trovare differenze. Grazie per il tuo impegno!
Alex
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.