qu'est-ce que l'indicateur docker run -it?

108

Je faisais des choses complexes avec docker, mais je ne sais pas ce que -itsignifie le drapeau. Récemment, je suis tombé sur un exemple de docker runcommandement qui m'a un peu dérouté.

docker run -itd ubuntu:xenial /bin/bash 

Ma question est de savoir quel est le sens d'écrire un -itindicateur ici, si le conteneur pendant l'exécution de l'instanciationbin/bash

Dans la documentation, nous avons un exemple

docker run --name test -it debian

avec explication

-It demande à Docker d'allouer un pseudo-TTY connecté au stdin du conteneur; créer un shell bash interactif dans le conteneur.

et explication de l'indicateur -t de la page d'aide

-t, --tty Allouer un pseudo-TTY

si je supprime l'indicateur -it pendant

docker run -d ubuntu:xenial /bin/bash

mon conteneur nouvellement créé ne vit pas tellement

dans docker ps -a

il est désigné comme sorti

Désolé, si ma question est assez stupide, je ne trouve pas d'explication sur Internet (j'ai un malentendu important sur ce point).

Alex
la source
Si /bin/bashaucun contenu n'est disponible sur stdin, il n'a aucune commande à exécuter et aucun moyen d'inviter l'utilisateur, il se ferme donc. Il s'agit d'un comportement normal et attendu à 100%.
Charles Duffy

Réponses:

97

-itest l'abréviation de --interactive + --ttylorsque vous utilisez docker runcette commande .. cela vous mènerait directement à l'intérieur du conteneur ,, où -dest court pour --detachce qui signifie que vous exécutez simplement le conteneur, puis que vous vous en détachez donc fondamentalement, vous exécutez le conteneur en arrière-plan .. edit: donc si vous exécutez le conteneur docker avec -itdlui, les -itoptions seront exécutées et vous détacheront du conteneur, de sorte que votre conteneur fonctionne toujours en arrière-plan, même sans application par défaut à exécuter.

Fendi jatmiko
la source
Ce n'est pas la bonne réponse, car mon conteneur est arrêté après avoir été exécuté sans l'option -it.
Alex
1
cela signifie qu'il y a une erreur dans votre conteneur .. donc votre conteneur n'a pas pu démarrer ... ou peut-être qu'il n'avait aucune CMDcommande par défaut ,, donc il n'a pas exécuté d'application par défaut. .so si vous l'exécutez en arrière-plan, il se fermait immédiatement car il n'avait aucun travail à faire. .
Fendi jatmiko
@Alex, si le programme dans votre conteneur est quelque chose qui se termine lorsque stdin est fermé, voici votre réponse (pour savoir pourquoi il ne fonctionnera pas sans -i). De même, s'il exécute des commandes qui se comportent différemment en fonction de l'existence ou non d'un TTY, vous pouvez obtenir un comportement distinct en fonction de la présence de -t.
Charles Duffy
@Alex, ... et pour être clair, /bin/bash </dev/nullquitte immédiatement aussi, si vous l'exécutez sans Docker. Courir docker runsans, -ic'est faire la même chose avec la copie de bashcelle qu'elle démarre. (Sans -t, il a un stdin mais pas un TTY, donc il ne se détecte pas comme un shell interactif, donc vous obtenez un ensemble de comportements légèrement différent).
Charles Duffy
1
@AdmiralAdama, ce qui résout le problème de couleur est l'option -t. TTY est nécessaire pour comprendre les jetons de couleur.
kroiz le
42

docker run -it ubuntu:xenial /bin/bashdémarre le conteneur en mode interactif (donc -itdrapeau) qui vous permet d'interagir avec /bin/bashle conteneur. Cela signifie que maintenant vous aurez la bashsession à l' intérieur du conteneur, de sorte que vous pouvez ls, mkdirou faire une commande bash à l' intérieur du conteneur.

La clé ici est le mot «interactif». Si vous omettez l'indicateur, le conteneur s'exécute toujours /bin/bashmais se ferme immédiatement. Avec le drapeau, le conteneur s'exécute /bin/bashpuis attend patiemment votre saisie.

dvnguyen
la source
1
pour ce dont j'ai besoin d'utiliser -t flag alors? docker run -i ubuntu:xenial /bin/bash
Alex
3
-t: pseudo tty, ou "pseudo terminal". Sans terminal, vous ne pouvez pas envoyer d'entrées au conteneur.
dvnguyen
docker run -it ubuntu:xenial merci pour la réponse, mais j'aurai également une session de terminal avec cette commande à partir de zéro (pour ce dont j'ai besoin d'exécuter bin / bash alors). Il crée également une session de terminal
Alex
1
Vous avez raison. Je vais reprendre mes paroles. Sans -tbalise, on peut toujours interagir avec le conteneur, mais avec lui, vous aurez un terminal plus agréable et plus de fonctionnalités. Vous pouvez courir avec -iet avec -itpour voir la différence.
dvnguyen
Je ne trouve aucune différence. Merci pour vos efforts!
Alex