L' -t
option va à la façon dont Unix / Linux gère l'accès au terminal. Dans le passé, un terminal était une connexion matérielle, plus tard une connexion basée sur un modem. Ceux-ci avaient des pilotes de périphériques physiques (c'étaient de vrais équipements). Une fois les réseaux généralisés mis en service, un pilote pseudo-terminal a été développé. En effet, cela crée une séparation entre la compréhension des capacités des terminaux qui peuvent être utilisées sans avoir besoin de les écrire directement dans votre programme (lire les pages de manuel stty
, curses
).
Donc, avec cela en arrière-plan, exécutez un conteneur sans options et par défaut, vous avez un flux stdout (donc ça docker run | <cmd>
marche); exécutez avec -i
, et vous obtenez un flux stdin ajouté (donc ça <cmd> | docker run -i
marche); utilisez -t
, généralement dans la combinaison -it
et vous avez un pilote de terminal ajouté, qui si vous interagissez avec le processus est probablement ce que vous voulez. Cela fait que le démarrage du conteneur ressemble à une session de connexion de terminal.
-it
drapeaux.docker run -i ubuntu
etdocker run -it ubuntu
vous verrez immédiatement la différence. "-i" vous permet de faire en sorte que le conteneur attende l'interaction de l'hôte, mais une interaction réelle depuis la console (terminal) est possible après avoir "alloué le pilote tty" avec l'indicateur "-t".-t
, mais je ne peux pas modifier la commande docker start en production. Je dois donc faire croire à l'application qu'elle a commencé-t
.Réponse tardive, mais pourrait aider quelqu'un
docker run/exec -i
connectera le STDIN de la commande à l'intérieur du conteneur au STDIN dedocker run/exec
lui - même.Alors
docker run -i alpine cat
vous donne une ligne vide en attente de saisie. Tapez "bonjour" vous obtenez un écho "bonjour". Le conteneur ne sortira pas tant que vous n'aurez pas envoyé CTRL+ Dcar le processus principalcat
attend l'entrée du flux infini qui est l'entrée terminale dudocker run
.echo "hello" | docker run -i alpine cat
affichera "bonjour" et quittera immédiatement car ilcat
remarque que le flux d'entrée s'est terminé et se termine lui-même.Si vous essayez
docker ps
après avoir quitté l'un des éléments ci-dessus, vous ne trouverez aucun conteneur en cours d'exécution. Dans les deux cas,cat
lui - même s'est terminé, donc docker a terminé le conteneur.Maintenant pour "-t", cela indique au processus principal dans docker que son entrée est un terminal.
Alors
docker run -t alpine cat
vous donnera une ligne vide, mais si vous essayez de taper "bonjour", vous n'obtiendrez aucun écho. En effet, alors quecat
est connecté à une entrée de borne, cette entrée n'est pas connectée à votre entrée. Le «bonjour» que vous avez tapé n'a pas atteint l'entrée decat
.cat
attend une entrée qui n'arrive jamais.echo "hello" | docker run -t alpine cat
vous donnera également une ligne vide et ne quittera pas le conteneur CTRL- Dmais vous n'aurez pas d'écho "bonjour" car vous n'avez pas réussi-i
Si vous envoyez CTRL+ C, vous récupérez votre shell, mais si vous essayez
docker ps
maintenant, vous voyez lecat
conteneur toujours en cours d'exécution. En effet,cat
il attend toujours un flux d'entrée qui n'a jamais été fermé. Je n'ai trouvé aucune utilisation utile pour le-t
seul sans être combiné avec-i
.Maintenant, pour
-it
ensemble. Cela indique à cat que son entrée est une borne et en même temps connectez cette borne à l'entréedocker run
dont est une borne.docker run/exec
s'assurera que sa propre entrée est en fait un tty avant de la passer àcat
. C'est pourquoi vous obtiendrez uninput device is not a TTY
si vous essayezecho "hello" | docker run -it alpine cat
car dans ce cas, l'entrée endocker run
elle-même est le canal de l'écho précédent et non le terminal oùdocker run
est exécutéEnfin, pourquoi auriez-vous besoin de réussir
-t
si vous réussissez à-i
connecter votre entrée à cellecat
de? En effet, les commandes traitent l'entrée différemment s'il s'agit d'un terminal. Ceci est également mieux illustré par l'exempledocker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -u root -p
vous donnera une invite de mot de passe. Si vous saisissez le mot de passe, les caractères sont imprimés visiblement.docker run -i alpine sh
vous donnera une ligne vide. Si vous tapez une commande comme sils
vous obteniez une sortie, mais vous n'obtiendrez pas une invite ou une sortie colorée.Dans les deux derniers cas, vous obtenez ce comportement parce
mysql
que vousshell
ne traitez pas l'entrée comme un tty et n'utilisez donc pas de comportement spécifique au tty comme masquer l'entrée ou colorer la sortie.la source
-t
et les-i
options font!L'
-t
argument n'est PAS bien documenté, ou souvent mentionné par de nombreuses personnes, selon une recherche Google.Il n'apparaît même pas lorsque vous affichez une liste de (ce qui devrait être) tous les arguments du client docker en tapant
docker
à l'invite Bash (avec la dernière version de 1.8.1).En fait, si vous essayez d'obtenir une aide spécifique sur cet argument en tapant
docker -t --help
if donne cette réponse incroyablement vague:Vous ne pouvez donc pas être blâmé d'être confus à propos de cet argument!
Il y a une mention dans la documentation en ligne Docker qui dit que c'est "Allouer un pseudo-tty" et qui est souvent utilisée avec
-i
:https://docs.docker.com/reference/run/
Je l'ai vu utilisé dans la documentation du formidable
jwilder/nginx-proxy
conteneur Docker de la manière suivante:Dans ce cas, il envoie la sortie au terminal «virtuel» (invite de commande Bash / terminal) dans ce conteneur Docker. Vous pouvez ensuite voir cette sortie en exécutant la commande docker
docker logs CONTAINER
où seCONTAINER
trouve le premier couple de caractères de l'ID de ce conteneur. Cet ID DE CONTENEUR peut être trouvé en tapantdocker ps -a
J'ai vu cet
-t
argument mentionné brièvement dans le lien suivant, où il est dithttps://coreos.com/os/docs/latest/getting-started-with-docker.html
J'espère que ça aide! Je ne sais pas pourquoi cela n'est pas documenté ou utilisé beaucoup. Peut-être que c'est expérimental et sera implémenté en tant que fonctionnalité documentée dans les prochaines versions.
la source
docker run --help
, pasdocker -t --help
:-t, --tty=false Allocate a pseudo-TTY
"Ce que je sais de
-t
ce qui suit est le suivant:docker exec -ti CONTAINER bash
- me permet de "me connecter" dans le conteneur. On dirait du sh-ing (ce n'est pas le cas).Mais le problème était quand je voulais restaurer une base de données.
Habituellement, je le fais
docker exec -ti mysql.5.7 mysql
- Ici, j'exécute la commande mysql dans le conteneur et obtient un terminal interactif.J'ai ajouté
<dump.sql
à la commande précédente pour pouvoir restaurer une base de données. Mais cela a échouécannot enable tty mode on non tty input
.Suppression de l'
-t
aide. Je ne comprends toujours pas pourquoi:Le dernier fonctionne. J'espère que cela aide les gens.
la source
-t
, mais je ne peux pas modifier la commande docker start en production. Je dois donc faire croire à l'application qu'elle a commencé-t
.Sous Linux, lorsque vous exécutez une commande, vous avez besoin d'un terminal (tty) pour l'exécuter.
Ainsi, lorsque vous souhaitez vous connecter à Docker (ou exécuter la commande dans le conteneur Docker), vous devez fournir l'option -t qui prend en compte le terminal à l'intérieur du conteneur Docker.
la source
Chaque processus a trois flux de données, à savoir
STDIN/ STDOUT/ STDERR
. Lorsqu'un processus s'exécute dans un conteneur, le terminal par défaut est connecté au flux STDOUT du processus s'exécutant dans le conteneur. Par conséquent, tous les flux de sortie seront visibles lors de l'exécution de ladocker run
commande dans le terminal. Mais si vous souhaitez fournir une entrée au processus en cours d'exécution dans le conteneur, vous devez vous connecter avec le canal STDIN du processus qui n'est pas par défaut et se fait avec ladocker run -i
commande.-t
est utilisé pour les opérations d'entrée interactives / formatées.la source
Le
-it
charge Docker d'allouer un pseudo-TTY connecté à la stdin du conteneur, créant un shell bash interactif dans le conteneur.--interactive
,-i
false
Gardez STDIN ouvert même s'il n'est pas attaché--tty
,-t
false
Attribuer un pseudo-ATShttps://docs.docker.com/engine/reference/commandline/run/
la source