2015-05-09 31 views
83

Che cosa fa esattamente questa opzione? Ho letto molto su TTY e sono ancora confuso. Mi sono divertito a non avere lo -t e solo lo -i e sembra che i programmi che si aspettano che l'input dell'utente generino un errore senza lo -t. Perché è importante abilitare lo pseudo-TTY?Confuso sull'opzione Docker -t per allocare uno pseudo-TTY

risposta

46

L'argomento "-t" NON è documentato bene, o menzionato da molte persone spesso, secondo una ricerca su Google.

Non viene nemmeno visualizzato quando viene visualizzato un elenco di (quali dovrebbero essere) tutti gli argomenti del client docker digitando "docker" al prompt di Bash (con l'ultima versione di 1.8.1).

In realtà, se si tenta di ottenere aiuto specifiche su questo argomento digitando "finestra mobile -t help", se dà questo incredibilmente vaga risposta:

"bandiera fornita ma non definiti: -t"

Quindi, non si può essere accusati di essere confusi su questo argomento!

C'è una menzione nel documention linea Docker, che dice che è a "Assegnare una pseudo-tty" ed è spesso usato con -i:

https://docs.docker.com/reference/run/

l'ho visto usato nella documentazione il contenitore finestra mobile jwilder formidabile/nginx-proxy nel modo seguente:

docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx 

in questo caso, ciò che fa è inviare l'output al tty 'virtuale' (Bash comando rapido/terminale) in questo contenitore finestra mobile. È quindi possibile vedere questo output eseguendo il comando docker "CONTAINER dei registri docker" dove CONTAINER è la prima coppia di caratteri dell'ID di questo contenitore. Questo ID del CONTAINER può essere trovato digitando "docker ps -a"

Ho visto questo argomento "-t" menzionato brevemente nel seguente link, dove dice "I flag -t e -i assegnano uno pseudo -tty e tieni aperto stdin anche se non è collegato.Questo ti permetterà di usare il contenitore come una macchina virtuale tradizionale fintanto che il prompt di bash è in esecuzione. "

https://coreos.com/os/docs/latest/getting-started-with-docker.html

Spero che questo aiuta! Non sono sicuro del motivo per cui questo non è documentato o utilizzato molto. Forse è sperimentale e verrà implementato come funzionalità documentata nelle prossime versioni.

+11

La documentazione si presenta per '--help' corsa finestra mobile, non' finestra mobile -t --help': '-t, --tty = false Allocare un pseudo-TTY' " – bskaggs

7

Quello che so sulla -t è il seguente:

docker exec -ti CONTAINER bash - mi permette di "login" nel contenitore. Sembra come ssh-ing (non lo è).

Ma il problema era quando volevo ripristinare un database.

In genere faccio docker exec -ti mysql.5.7 mysql - Qui eseguo il comando mysql nel contenitore e ottengo un terminale interattivo.

Ho aggiunto <dump.sql al comando precedente in modo da poter ripristinare un db. Ma non è riuscito con .

Rimozione di -t aiutato.Ancora non capisco perché:

docker exec -i mysql.5.7 mysql < dump.sql 

L'ultimo funziona. Spero che questo aiuti le persone.

43

L'opzione "-t" spiega come Unix/Linux gestisce l'accesso al terminale. In passato, un terminale era una connessione hardline, in seguito una connessione basata su modem. Questi avevano driver di dispositivo fisici (erano veri pezzi di equipaggiamento). Una volta che le reti generalizzate sono state utilizzate, è stato sviluppato un driver pseudo-terminale. Questo perché crea una separazione tra la comprensione di quali funzionalità del terminale possono essere utilizzate senza la necessità di scriverle direttamente nel programma (leggere le pagine man su stty, curses).

Quindi, con quello come sfondo, eseguire un contenitore senza opzioni e per impostazione predefinita si dispone di un flusso stdout (quindi docker run | <cmd> funziona); corri con "-i" e ottieni lo stdin stream aggiunto (quindi <cmd> | docker run -i funziona); usa "-t", di solito nella combinazione "-it" e hai un driver del terminale aggiunto, che se stai interagendo con il processo è probabilmente quello che vuoi. Fondamentalmente fa apparire il contenitore come una sessione di connessione terminale.

1

Il comando -it ordina a Docker di allocare uno pseudo-TTY connesso allo stdin del contenitore, creando una shell bash interattiva nel contenitore.

--interactive, -i false Keep STDIN open even if not attached 

--tty, -t false Allocate a pseudo-TTY 

https://docs.docker.com/engine/reference/commandline/run/