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).


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.