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 Jenkinsfile
interaktiven Modus auszuführen ?
Ich habe im Grunde eine Datei namens script.sh
, die ich im Docker-Container ausführen möchte.
docker
jenkins
jenkins-pipeline
Anthony
quelle
quelle
Antworten:
Entfernen Sie das
-it
aus 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,
-i
wenn Sie Eingaben in den Docker-Befehl geleitet haben, die nicht von einem TTY stammen. Wenn Sie so etwas wiexyz | docker ...
oderdocker ... <input
in Ihrer Befehlszeile haben, tun Sie dies.Sie können es auch ändern,
-t
wenn 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 .
quelle
mysql -p
ohne Angabe eines Passworts. Wenn Sie nur-i
die Kennwortabfrage hinzufügen, wird diese nie angezeigt. Wenn Sie nur-t
die 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?Für diejenigen, die mit diesem Fehler zu kämpfen haben und unter Windows Git Bash spielen, verwenden Sie einfach PowerShell, wo es
-it
perfekt funktioniert.quelle
Es ist nicht genau das, was Sie fragen, aber:
Die -T-Taste würde Leuten helfen, die Docker-Compose Exec verwenden!
quelle
docker-compose exec
wird ein TTY zugewiesen.Wenn Sie (wie ich) Git Bash unter Windows verwenden, müssen Sie nur setzen
vor Ihrer 'Docker-Linie':
quelle
winpty
?C:\Program Files\Git\usr\bin\winpty.exe
Ich glaube, Sie müssen sich in einem TTY befinden, damit Docker ein TTY zuweisen kann (die
-t
Option). 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
-t
Option:quelle
docker run…
Befehl aus einer Makefile-Aufgabebei Verwendung von 'git bash',
1) Ich führe den Befehl aus:
Ich habe den Fehler:
2) dann führe ich den Befehl aus:
Ich habe einen anderen Fehler:
3) Drittens führe ich Folgendes aus:
es funktionierte.
Wenn ich 'Powershell' benutze, hat alles gut funktioniert.
quelle
Wenn Sie Windows verwenden, versuchen Sie es mit cmd. Bei mir funktioniert es. Überprüfen Sie, ob Docker gestartet ist.
quelle
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.
quelle
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
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.
quelle
Der unten gezeigte Jenkins-Pipeline-Schritt ist mit demselben Fehler fehlgeschlagen.
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:
quelle