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 de docker 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 principal cat
attend l'entrée du flux infini qui est l'entrée terminale du docker run
.
- D'un autre côté,
echo "hello" | docker run -i alpine cat
affichera "bonjour" et quittera immédiatement car il cat
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 que cat
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 de cat
. 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 le cat
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ée docker 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 un input device is not a TTY
si vous essayez echo "hello" | docker run -it alpine cat
car dans ce cas, l'entrée en docker 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 à celle cat
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'exemple
docker 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 si ls
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 vous shell
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.
-it
drapeaux.