Fehler "Das Eingabegerät ist kein TTY"

424

Ich führe den folgenden Befehl von meinem aus Jenkinsfile. Ich erhalte jedoch die Fehlermeldung "Das Eingabegerät ist kein TTY" .

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

Gibt es eine Möglichkeit, das Skript im Jenkinsfileinteraktiven Modus auszuführen ?

Ich habe im Grunde eine Datei namens script.sh, die ich im Docker-Container ausführen möchte.

Anthony
quelle
Für * nix scheint es hier keine Lösung zu geben. 'docker exec -i' funktioniert nicht und '-t' auch nicht.
rjurney
1
@rjurney Hast du jemals eine Lösung für Docker Exec gefunden? Ich habe -i und -t ohne Erfolg versucht. docker exec -it mycontainer bash certbot --apache -d www.website.com --email *********@gmail.com --agree-tos -n
Hutch
@ Hutch Sorry, ich kann mich nicht erinnern :(
rjurney

Antworten:

638

Entfernen Sie das -itaus Ihrem CLI, um es nicht interaktiv zu machen, und entfernen Sie das TTY. Wenn Sie dies auch nicht benötigen, z. B. indem Sie Ihren Befehl in einem Jenkins- oder Cron-Skript ausführen, sollten Sie dies tun.

Oder Sie können es ändern, -iwenn Sie Eingaben in den Docker-Befehl geleitet haben, die nicht von einem TTY stammen. Wenn Sie so etwas wie xyz | docker ...oder docker ... <inputin Ihrer Befehlszeile haben, tun Sie dies.

Sie können es auch ändern, -twenn Sie TTY-Unterstützung wünschen, diese aber auf dem Eingabegerät nicht verfügbar haben. Führen Sie dies aus, um die Ausgabe in Ihren Protokollen farblich zu formatieren oder um sie später mit einem geeigneten Terminal an den Container anzuhängen.

Wenn Sie ein interaktives Terminal benötigen und unter Linux oder MacOS nicht in einem Terminal ausgeführt werden, verwenden Sie eine andere Befehlszeilenschnittstelle. Es wird berichtet, dass PowerShell diese Unterstützung unter Windows enthält.


Was ist ein TTY? Es handelt sich um eine Terminalschnittstelle, die Farbausgabe, Escape-Sequenzen, Bewegen des Cursors usw. unterstützt und aus den alten Zeiten dummer Terminals stammt, die an Mainframes angeschlossen sind. Heute wird es von den Linux-Befehlsterminals und SSH-Schnittstellen bereitgestellt. Weitere Informationen finden Sie im Wikipedia-Artikel .

BMitch
quelle
10
Ich verwende diesen Befehl in Verbindung mit mysql -pohne Angabe eines Passworts. Wenn Sie nur -idie Kennwortabfrage hinzufügen, wird diese nie angezeigt. Wenn Sie nur -tdie Eingabeaufforderung hinzufügen , wird die Eingabe (die buchstäblich gedruckt wird, anstatt von der Eingabeaufforderung ausgeblendet zu werden) überhaupt nicht gelesen, auch nicht, wenn Sie die Eingabetaste drücken. Nur Strg-C kann es beenden. Ist es irgendwie möglich, den MySQL-Client mit Docker auf diese Weise zu verwenden?
Ohcibi
95

Für diejenigen, die mit diesem Fehler zu kämpfen haben und unter Windows Git Bash spielen, verwenden Sie einfach PowerShell, wo es -itperfekt funktioniert.

Piotr Justyna
quelle
12
Dies beantwortet die Frage nicht. Die Frage bezieht sich auf Docker in Jenkins, nicht auf Git Bash unter Windows.
44
Gut. wahr, und es war nie beabsichtigt. Die Frage wird in Google angezeigt, wenn Sie nach dieser bestimmten Fehlermeldung suchen. Ich dachte mir, es wäre besser, die Antwort irgendwo zu haben, als sie überhaupt nicht zu haben. Offensichtlich fanden es einige Leute nützlich :)
Piotr Justyna
3
Das Problem mit Powershell als TTY für Shell-Operationen besteht darin, dass die Pfeiltasten nicht ordnungsgemäß übergeben werden, wie z. B. der Aufwärtspfeil für den Verlauf des Befehls. Funktioniert großartig, abgesehen von diesem Mangel.
Corgalore
2
Wenn Sie Git Bash weiterhin verwenden möchten, sehen Sie diese Antwort auf eine andere Frage oder die winpty Antwort unten
tessafyi
67

Es ist nicht genau das, was Sie fragen, aber:

Die -T-Taste würde Leuten helfen, die Docker-Compose Exec verwenden!

docker-compose -f /srv/backend_bigdata/local.yml exec -T postgres backup
Yestema
quelle
2
genau das, wonach ich gesucht habe. Weißt du warum das funktioniert?
Ulad Kasach
6
Genau das, was ich auch brauchte. Entsprechend der Hilfe: -T Deaktivieren Sie die Pseudo-Tty-Zuordnung. Standardmäßig docker-compose exec wird ein TTY zugewiesen.
TS
Danke, Mann. Ich suche es nach Docker-Compose!
ADyDyka
Das hat bei mir funktioniert!
Rlorenzo
58

Wenn Sie (wie ich) Git Bash unter Windows verwenden, müssen Sie nur setzen

winpty

vor Ihrer 'Docker-Linie':

winpty docker exec -it some_cassandra bash
Gremi64
quelle
Wie lädst du herunter winpty?
Mor Shemesh
6
Hast du es versucht, bevor du gefragt hast? Ich denke, es kommt mit Git (meins ist drin ... / Git / usr / bin)
Gremi64
Sie haben Recht, es ist unterC:\Program Files\Git\usr\bin\winpty.exe
Mor Shemesh
31

Ich glaube, Sie müssen sich in einem TTY befinden, damit Docker ein TTY zuweisen kann (die -tOption). Jenkins führt seine Jobs nicht in einem TTY aus.

Allerdings möchten Sie das Skript, das Sie in Jenkins ausführen, möglicherweise auch lokal ausführen. In diesem Fall kann es sehr praktisch sein, ein TTY zuzuweisen, damit Sie Signale wie ctrl+ senden können, cwenn Sie es lokal ausführen.

Um dies zu beheben, verwenden Sie Ihr Skript optional mit der folgenden -tOption:

test -t 1 && USE_TTY="-t" 
docker run ${USE_TTY} ...
Gareth A. Lloyd
quelle
Dieser Fehler passiert mir, wenn ich einen docker run…Befehl aus einer Makefile-Aufgabe
Édouard Lopez,
1
Dies sollte die akzeptierte Antwort sein. es spricht das Problem tatsächlich auf universell anwendbare Weise an
roothahn
11

bei Verwendung von 'git bash',

1) Ich führe den Befehl aus:

docker exec -it 726fe4999627 /bin/bash

Ich habe den Fehler:

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

2) dann führe ich den Befehl aus:

winpty docker exec -it 726fe4999627 /bin/bash

Ich habe einen anderen Fehler:

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) Drittens führe ich Folgendes aus:

winpty docker exec -it 726fe4999627 bash

es funktionierte.

Wenn ich 'Powershell' benutze, hat alles gut funktioniert.

wangsir
quelle
Ich habe auch meinen Kopf für ein paar Stunden mit Bash gegen die Wand geschlagen. Auf Powershell umgestellt und alles funktioniert jetzt!
David Spenard
5

Wenn Sie Windows verwenden, versuchen Sie es mit cmd. Bei mir funktioniert es. Überprüfen Sie, ob Docker gestartet ist.

Diego Santa Cruz Mendezú
quelle
1

winpty funktioniert, solange Sie keine anzuhängenden Volumes wie ".: / mountpoint" oder "$ {pwd}: / mountpoint" angeben.

Die beste Problemumgehung, die ich gefunden habe, besteht darin, das Git-Bash-Plugin in Visual Code Studio zu verwenden und das Terminal zum Starten und Stoppen von Containern oder zum Erstellen von Docker zu verwenden.

Rusty1
quelle
1

Ich weiß, dass dies nicht direkt die vorliegende Frage beantwortet, sondern für jeden, der auf diese Frage stößt und WSL verwendet, auf dem Docker für Windows und Cmder oder Conemu ausgeführt wird.

Der Trick besteht nicht darin, Docker zu verwenden, das unter Windows unter / mnt / c / Programme / Docker / Docker / resources / bin / docker.exe installiert ist, sondern Ubuntu / Linux Docker zu installieren. Es ist erwähnenswert, dass Sie Docker nicht selbst innerhalb der WSL ausführen können, sondern über den Linux Docker-Client eine Verbindung zu Docker für Windows herstellen können.

Installieren Sie Docker unter 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

Stellen Sie über Port 2375 eine Verbindung zu Docker für Windows her, die über die Einstellungen in Docker für Windows aktiviert werden muss.

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

Oder setzen Sie die Variable docker_host, mit der Sie den Schalter -H weglassen können

export DOCKER_HOST=tcp://localhost:2375

Sie sollten jetzt in der Lage sein, eine interaktive Verbindung mit einer tty-Terminalsitzung herzustellen.

Damo
quelle
0

Der unten gezeigte Jenkins-Pipeline-Schritt ist mit demselben Fehler fehlgeschlagen.

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

In meiner Skriptdatei " build.sh " gibt der Befehl " docker run " diesen Fehler aus, als er von Jenkins Job ausgeführt wurde. Es funktionierte jedoch einwandfrei, als das Skript im Shell-Terminal ausgeführt wurde. Der Fehler trat auf, weil die Option -t an den Docker- Befehl run übergeben wurde, der bekanntlich versucht, das Terminal zuzuweisen, und fehlschlägt, wenn kein Terminal zuzuweisen ist.

In meinem Fall habe ich das Skript nur dann in die Option -t geändert, wenn ein Terminal erkannt werden konnte. Hier ist der Code nach Änderungen:

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
Namik Hajiyev
quelle