GNU/Linux >> Tutoriels Linux >  >> Linux

Que signifie exactement le périphérique d'entrée n'est pas un TTY dans la sortie d'exécution du docker ?

Solution 1 :

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 du docker run/exec lui-même.

Alors

  • docker run -i alpine cat vous donne une ligne vide en attente d'entrée. Tapez "bonjour" vous obtenez un écho "bonjour". Le conteneur ne se fermera pas tant que vous n'aurez pas envoyé CTRL+D car le processus principal cat attend l'entrée du flux infini qui est l'entrée terminale du docker run .
  • Par contre echo "hello" | docker -i run alpine cat affichera "hello" et sortira immédiatement car cat remarque que le flux d'entrée est terminé et se termine de 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 à l'intérieur de 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. C'est parce que tant 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 sortira pas du conteneur sur CTRL-D mais vous n'obtiendrez pas d'écho "hello" car vous n'avez pas passé -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. C'est parce que cat 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 un terminal et en même temps connecte ce terminal à l'entrée de docker run qui est une borne. docker run/exec s'assurera que sa propre entrée est bien 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 de docker run lui-même est le tube de l'écho précédent et non le terminal où docker run est exécuté

Enfin, pourquoi auriez-vous besoin de passer -t si -i fera l'affaire de connecter votre entrée à cat l'entrée ? C'est parce que les commandes traitent l'entrée différemment s'il s'agit d'un terminal. Ceci est également mieux illustré par un exemple

  • docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -p vous donnera une invite de mot de passe. Si vous tapez le mot de passe, les caractères sont imprimés de manière visible.
  • docker run -i alpine sh vous donnera une ligne vide. Si vous tapez une commande comme ls vous obtenez une sortie, mais vous n'obtiendrez pas d'invite ou de sortie colorée.

Dans les deux derniers cas, vous obtenez ce comportement car mysql ainsi que shell ne traitaient pas l'entrée comme un tty et n'utilisaient donc pas de comportement spécifique au tty comme le masquage de l'entrée ou la coloration de la sortie.

Solution 2 :

Cette réponse m'a aidé à comprendre :

  • par défaut (sans ni -i ni -t options) un conteneur Docker n'envoie sa sortie qu'à STDOUT,
  • avec -i option vient connexion à STDIN,
  • -t l'option extrait un pilote d'interface de terminal , qui fonctionne en plus de STDIN/STDOUT. Et lorsqu'un pilote de terminal est activé, la communication avec un conteneur doit être conforme au protocole d'interface du terminal. Canaliser une chaîne ne fonctionne pas.

Solution 3 :

Un tty indique que vous avez un terminal, quelque chose qui serait fourni par xterm ou l'une des nombreuses interfaces de ligne de commande Linux. Il a besoin d'un clavier et d'une interface de sortie de texte qui lui sont associés. Les raisons typiques de vouloir cela sont la prise en charge de la sortie de texte en couleur, la gestion de diverses combinaisons de touches (comme les touches fléchées) et la possibilité de déplacer le curseur sur l'écran.

Lorsque vous dirigez une commande dans docker comme votre echo l'exemple montre, ce tuyau est l'entrée, et ce tuyau n'a pas d'interface tty, c'est juste un flux de texte. Tenter de créer un tty avec cela échouera comme l'indique le message d'erreur.


Linux
  1. Que signifie la taille d'un répertoire dans la sortie de la commande "ls -l" ?

  2. Que signifie le tilde (~) à la fin d'un nom de fichier ? ?

  3. Que signifie l'attribut "s" dans les autorisations de fichiers ? ?

  4. Que signifie rc dans les fichiers dot

  5. Que signifie &à la fin d'une commande Linux ?

Que signifie un point avant le nom de la variable dans struct ?

Que signifie la syntaxe |&en langage shell ?

Que signifie le « rc » dans « .bashrc », etc. ?

Que signifie le symbole du tuyau linux | fais?

iptables :que signifie exactement --src-type LOCAL ?

Que signifie un + à la fin des autorisations de ls -l ?