web-dev-qa-db-fra.com

Erreur "Le périphérique d'entrée n'est pas un téléscripteur"

J'exécute la commande suivante à partir de mon Jenkinsfile. Cependant, je reçois le message d'erreur "Le périphérique d'entrée n'est pas un téléscripteur".

docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh

Existe-t-il un moyen d'exécuter le script à partir de Jenkinsfile sans passer en mode interactif?

J'ai essentiellement un fichier appelé script.sh que je voudrais exécuter à l'intérieur du conteneur Docker.

284
Anthony

Supprimez le -it de votre CLI pour le rendre non interactif et supprimez le TTY. Si vous n’avez pas besoin de l’un ou l’autre, par exemple en exécutant votre commande dans un script Jenkins ou cron, vous devriez le faire.

Ou vous pouvez le changer en -i si vous avez une entrée canalisée dans la commande de menu fixe qui ne provient pas d'un TTY. Si vous avez quelque chose comme xyz | docker ... ou docker ... <input dans votre ligne de commande, faites ceci.

Ou vous pouvez le changer en -t si vous voulez le support TTY mais que vous ne l'ayez pas disponible sur le périphérique d'entrée. Faites cela pour le formatage en couleur de la sortie dans vos journaux ou lorsque vous vous attacherez ultérieurement au conteneur avec un terminal approprié.

Ou si vous avez besoin d'un terminal interactif et que vous ne travaillez pas sur un terminal sous Linux ou MacOS, utilisez une interface de ligne de commande différente. Il est rapporté que PowerShell inclut ce support sous Windows.


Qu'est-ce qu'un ATS? C'est une interface de terminal qui prend en charge la sortie couleur, les séquences d'échappement, le déplacement du curseur, etc., qui provient de l'ancien temps des terminaux muets attachés aux ordinateurs centraux. Aujourd'hui, il est fourni par les terminaux de commande Linux et les interfaces ssh. Voir le article de wikipedia pour plus de détails .

447
BMitch

Pour ceux qui ont des problèmes avec cette erreur et git bash sous Windows, utilisez simplement PowerShell où -it fonctionne parfaitement.

58
Piotr Justyna

Si vous utilisez (comme moi) git bash sous windows, il vous suffit de mettre

heureux

avant votre 'ligne de docker':

winpty docker exec -it some_cassandra bash
39
Gremi64

Je crois que vous devez être dans un ATS pour le menu fixe pour pouvoir attribuer un ATS (l'option -t). Jenkins exécute ses travaux pas dans un ATS.

Cela dit, le script que vous exécutez dans Jenkins peut également être utilisé localement. Dans ce cas, il peut être très pratique d’attribuer un téléscripteur pour pouvoir envoyer des signaux tels que ctrl+c en l'exécutant localement.

Pour résoudre ce problème, utilisez éventuellement l'option -t de votre script, comme suit:

test -t 1 && USE_TTY="-t" 
docker run ${USE_TTY} ...
24
Gareth A. Lloyd

Ce n'est pas exactement ce que vous demandez, mais:

La - touche T aiderait ceux qui utilisent docker-compose exec!

docker-compose -f /srv/backend_bigdata/local.yml exec -T postgres backup
5
yestema

si vous utilisez Windows, essayez avec cmd, cela fonctionne pour moi. vérifiez si le menu fixe est démarré.

Je sais que cela ne répond pas directement à la question, mais à quiconque se posant sur cette question utilise WSL sous Docker pour windows and cmder ou conemu.

L'astuce consiste à ne pas utiliser Docker installé sur Windows sous/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe, mais plutôt à installer le Docker ubuntu/linux. Il est intéressant de noter que vous ne pouvez pas exécuter Docker lui-même à partir de WSL, mais vous pouvez vous connecter à Docker pour Windows à partir du client Linux Docker.

Installer Docker sur Linux

Sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | Sudo apt-key add -
Sudo add-apt-repository "deb [Arch=AMD64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Sudo apt-get update
Sudo apt-get install docker-ce

Connectez-vous à Docker pour Windows sur le port 2375 qui doit être activé à partir des paramètres du menu fixe pour Windows.

docker -H localhost:2375 run -it -v /mnt/c/code:/var/app -w "/var/app" centos:7

Ou définissez la variable docker_Host qui vous permettra d’omettre le commutateur -H

export DOCKER_Host=tcp://localhost:2375

Vous devriez maintenant pouvoir vous connecter de manière interactive à une session de terminal tty.

1
Damo

winpty fonctionne tant que vous ne spécifiez pas de volumes à monter, tels que ".:/mountpoint" ou "$ {pwd}:/mountpoint"

La meilleure solution que j'ai trouvée consiste à utiliser le plug-in git-bash dans Visual Code Studio et à utiliser le terminal pour démarrer et arrêter des conteneurs ou docker-compose.

1
Rusty1

en utilisant 'git bash',

1) J'exécute la commande:

docker exec -it 726fe4999627 /bin/bash

J'ai l'erreur:

the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

2) alors, j'exécute la commande:

winpty docker exec -it 726fe4999627 /bin/bash

J'ai une autre erreur:

OCI runtime exec failed: exec failed: container_linux.go:344: starting container process caused "exec: \"D:/Git/usr/bin/
bash.exe\": stat D:/Git/usr/bin/bash.exe: no such file or directory": unknown

3) troisième, j'exécute le:

winpty docker exec -it 726fe4999627 bash

ça a marché.

quand j'ai utilisé 'powershell', tout a bien fonctionné.

0
wangsir