Erreur «Le périphérique d'entrée n'est pas un ATS»


427

J'exécute la commande suivante à partir de mon Jenkinsfile. Cependant, j'obtiens l'erreur "Le périphérique d'entrée n'est pas un ATS" .

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

Existe-t-il un moyen d'exécuter le script à partir du Jenkinsfilesans faire de mode interactif?

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


Pour * nix, il semble qu'il n'y ait pas de solution ici. 'docker exec -i' ne fonctionne pas, ni '-t'.
rjurney

1
@rjurney Avez-vous déjà trouvé une solution pour docker exec? J'ai essayé -i et -t sans succès. docker exec -it mycontainer bash certbot --apache -d www.website.com --email *********@gmail.com --agree-tos -n
Hutch

@Hutch Désolé, je ne me souviens pas :(
rjurney

Réponses:


641

Retirez le -itde votre cli pour le rendre non interactif et supprimez le TTY. Si vous n'avez pas besoin non plus, par exemple d'exécuter votre commande à l'intérieur d'un script Jenkins ou cron, vous devriez le faire.

Ou vous pouvez le changer -isi vous avez introduit des entrées dans la commande docker qui ne proviennent pas d'un ATS. Si vous avez quelque chose comme xyz | docker ...ou docker ... <inputdans votre ligne de commande, faites cela.

Ou vous pouvez le remplacer par -tsi vous souhaitez un support TTY mais que vous ne l'avez pas disponible sur le périphérique d'entrée. Faites-le pour le formatage des couleurs de la sortie dans vos journaux, ou pour une connexion ultérieure au conteneur avec un terminal approprié.

Ou si vous avez besoin d'un terminal interactif et que vous ne l'exécutez pas dans un terminal sous Linux ou MacOS, utilisez une interface de ligne de commande différente. Il est rapporté que PowerShell inclut cette prise en charge 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 stupides attachés aux mainframes. Aujourd'hui, il est fourni par les terminaux de commande Linux et les interfaces ssh. Voir l' article wikipedia pour plus de détails .


10
J'utilise cette commande en conjonction avec mysql -psans spécifier de mot de passe. Lorsque vous ajoutez simplement -il'invite de mot de passe n'apparaît jamais. Avec juste l'ajout de -tl'invite apparaît, mais il semble ne pas lire du tout l'entrée (qui est imprimée littéralement au lieu d'être masquée par l'invite), même pas en appuyant sur retour; seul ctrl-c peut y mettre fin. Est-il possible d'utiliser le client mysql avec docker de cette façon?
ohcibi

95

Pour ceux qui ont du mal avec cette erreur et git bash sous Windows, utilisez simplement PowerShell où cela -itfonctionne parfaitement.


12
Cela ne répond pas à la question. La question concerne le docker dans Jenkins, pas git bash sous Windows.

45
Bien. vrai, et ce n'était jamais prévu. La question apparaît dans google lorsque vous recherchez ce message d'erreur spécifique. Je me suis dit qu'il valait mieux avoir la réponse quelque part que de ne pas l'avoir du tout. De toute évidence, certaines personnes l'ont trouvé utile :)
Piotr Justyna

3
Le problème avec Powershell en tant que TTY pour les opérations shell est qu'il ne transmet pas correctement les touches fléchées, comme la flèche vers le haut pour l'historique des commandes de cycle. Fonctionne très bien à part cette lacune.
Corgalore

2
Si vous voulez continuer à utiliser Git Bash, voyez cette réponse sur une autre question ou la réponse vide ci
tessafyi

68

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

La touche -T aiderait les personnes qui utilisent un docker-compose exec!

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

2
exactement ce que je cherchais. savez-vous pourquoi cela fonctionne?
Ulad Kasach

6
Juste ce dont j'avais besoin aussi. Selon l'aide: -T Désactive l'allocation de pseudo-tty. Par défaut, docker-compose exec alloue un ATS.
TS

Merci mec. Je le recherche pour docker-compose!
ADyDyka

Cela a fonctionné pour moi!
rlorenzo

59

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

winpty

avant votre 'docker line':

winpty docker exec -it some_cassandra bash

comment téléchargez-vous winpty?
Mor Shemesh

6
Avez-vous essayé avant de demander? Je pense qu'il vient avec Git (le mien est à l'intérieur ... / Git / usr / bin)
Gremi64

Vous avez raison, c'est sousC:\Program Files\Git\usr\bin\winpty.exe
Mor Shemesh

31

Je crois que vous devez être dans un ATS pour que Docker puisse allouer un ATS (l' -toption). Jenkins exécute ses travaux pas dans un ATS.

Cela dit, le script que vous exécutez dans Jenkins peut également être exécuté localement. Dans ce cas, il peut être très pratique d'avoir un TTY alloué afin que vous puissiez envoyer des signaux comme ctrl+ clorsque vous l'exécutez localement.

Pour résoudre ce problème, utilisez éventuellement votre script -t, comme ceci:

test -t 1 && USE_TTY="-t" 
docker run ${USE_TTY} ...

Cette erreur m'est docker run…
Édouard Lopez

1
ce devrait être la réponse acceptée. il résout en fait le problème d'une manière universellement applicable
roothahn

11

lors de l'utilisation de '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) puis, 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èmement, j'exécute:

winpty docker exec -it 726fe4999627 bash

ça a marché.

lorsque j'utilise «powershell», tout fonctionnait bien.


Je me suis aussi cogné la tête contre le mur pendant quelques heures avec ces problèmes en utilisant bash. Passé à Powershell et tout fonctionne maintenant!
David Spenard


1

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

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


1

Je sais que cela ne répond pas directement à la question posée, mais à quiconque rencontre cette question qui utilise WSL exécutant Docker pour Windows et cmder ou conemu.

L'astuce n'est pas d'utiliser Docker qui est installé sur Windows sous / mnt / c / Program Files / Docker / Docker / resources / bin / docker.exe mais plutôt d'installer ubuntu / linux Docker. Il convient de souligner 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 de Docker 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 avec une session de terminal tty.


0

Mon étape de pipeline Jenkins illustrée ci-dessous a échoué avec la même erreur.

       steps {
            echo 'Building ...' 
            sh 'sh ./Tools/build.sh'
        }

Dans mon fichier de script " build.sh ", la commande " docker run " affiche cette erreur lorsqu'elle a été exécutée par le travail Jenkins. Cependant, cela fonctionnait bien lorsque le script s'exécutait dans le terminal shell. L'erreur s'est produite en raison de l' option -t transmise à la commande docker run qui, comme je le sais, essaie d'allouer le terminal et échoue s'il n'y a pas de terminal à allouer.

Dans mon cas, j'ai changé le script pour passer l'option -t uniquement si un terminal pouvait être détecté. Voici le code après modifications:

DOCKER_RUN_OPTIONS="-i --rm"

# Only allocate tty if we detect one
if [ -t 0 ] && [ -t 1 ]; then
    DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS -t"
fi

docker run $DOCKER_RUN_OPTIONS --name my-container-name  my-image-tag
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.