La commande docker exec -it
Renvoie l'erreur suivante "Impossible d'activer le mode tty avec une entrée non tty"
level="fatal" msg="cannot enable tty mode on non tty input"
J'exécute docker (1.4.1) sur la boîte 6.6 de centos. J'essaie d'exécuter la commande suivante docker exec -it containerName /bin/bash
Mais j'obtiens l'erreur suivante
level="fatal" msg="cannot enable tty mode on non tty input"
Fonctionnement docker exec -i
au lieu de docker exec -it
résolu mon problème. En effet, mon script a été lancé par CRONTAB qui n’est pas un terminal.
Pour rappel:
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container
-i, --interactive=false Keep STDIN open even if not attached
-t, --tty=false Allocate a pseudo-TTY
Si vous obtenez cette erreur dans client docker Windows, vous devrez peut-être utiliser la commande run comme ci-dessous.
$ winpty docker run -it ubuntu /bin/bash
utilisez simplement "-i"
docker exec -i [votre-ps] [commande]
Si vous utilisez Windows et utilisez docker-machine et que vous utilisez GIT Bash ou Cygwin, pour "entrer dans" un conteneur en cours d'exécution, vous devez procéder comme suit:
docker-machine ssh default
pour ssh dans la machine virtuelle (Virtualbox le plus probable)
docker exec -it <container> bash
pour entrer dans le conteneur.
MODIFIER:
J'ai récemment découvert que si vous utilisez Windows PowerShell, vous pouvez directement exécuter le menu fixe dans le conteneur. Avec Cygwin ou Git Bash, vous pouvez utiliser winpty docker exec -it <container> bash
et passez le docker-machine ssh
étape ci-dessus.
J'obtiens "ne peux pas activer le mode tty sur une entrée non tty" pour la commande suivante sous Windows avec boot2docker
docker exec -it <containerIdOrName> bash
La commande ci-dessous corrige le problème
winpty docker exec -it <containerIdOrName> bash
docker exec
exécute une nouvelle commande dans un conteneur déjà en cours d'exécution . Ce n'est pas la façon de démarrer un nouveau conteneur - utilisez docker run
pour ça.
Cela peut être la cause de l'erreur "non tty input". Ou ce pourrait être l'endroit où vous exécutez docker. Est-ce un vrai terminal? Autrement dit, une session tty complète est-elle disponible? Vous voudrez peut-être vérifier si vous êtes dans une session interactive avec
[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'
à partir de https://unix.stackexchange.com/questions/26676/how-to-check-if-a-Shell-is-login-interactive-batch
J'ai rencontré ce même message d'erreur dans Windows 7 64 bits en utilisant Mintty fourni avec Git pour Windows. $docker run -i -t ubuntu /bin/bash cannot enable tty mode on non tty input
J'ai essayé de préfixer la commande ci-dessus avec winpty comme le suggéraient d'autres réponses, mais son exécution m'a montré un autre message d'erreur ci-dessous: $ winpty docker run -i -t ubuntu /bin/bash exec: "D:\\Git\\usr\\bin\\bash": executable file not found in $PATH docker: Error response from daemon: Container command not found or does not exist..
Ensuite, il m'est arrivé de lancer la commande suivante qui m'a donné ce que je voulais: $ winpty docker run -i -t ubuntu bash root@512997713d49:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr root@512997713d49:/#
J'exécute docker exec -it sous les travaux jenkins et obtiens une erreur "ne peut pas activer le mode tty sur une entrée non tty". Aucune sortie vers la commande docker exec n'est renvoyée. Ma séquence de connexion au travail était:
jenkins Shell -> ssh user@<testdriver> -> ssh root@<sut> -> su - <user> -> docker exec -it <container>
J'ai fait un changement pour utiliser -T flag dans le ssh initial de jenkins. "-T - Désactive l'allocation de pseudo-terminaux". Et utilisez -i flag avec docker exec au lieu de -it. "-i - interactif. -t - alloue une pseudo tty.". Cela semble avoir résolu mon problème.
jenkins Shell -> ssh -T user@<testdriver> -> ssh root@<sut> -> su - <user> -> docker exec -i <container>
Le comportement kindof correspond à ce bogue de l'administrateur de docker: https://github.com/docker/docker/issues/8755 . Solution de contournement sur cette discussion de bogue docker suggère d'utiliser ceci:
docker exec -it <CONTAINER> script -qc <COMMAND>
Utiliser cette solution de contournement n'a pas résolu mon problème. C'est intéressant cependant. Essayez-les en utilisant différents drapeaux et sous différentes invocations ssh, vous pouvez voir 'pas un tty' même avec -t avec docker exec:
$ docker exec -it <CONTAINER> script -qc 'tty'
/dev/pts/0
$ docker exec -it <CONTAINER> 'tty'
not a tty
$ docker exec -it <CONTAINER> bash -c 'tty'
not a tty