Späte Antwort, könnte aber jemandem helfen
docker run/exec -i
verbindet die STDIN des Befehls im Container mit der STDIN des docker run/exec
selbst.
So
docker run -i alpine cat
gibt Ihnen eine leere Zeile, die auf Eingabe wartet. Geben Sie "Hallo" ein, Sie erhalten ein Echo "Hallo". Der Container wird erst beendet, wenn Sie CTRL+ senden, Dda der Hauptprozess cat
auf die Eingabe aus dem unendlichen Stream wartet, der die Terminaleingabe des ist docker run
.
- Auf der anderen Seite
echo "hello" | docker run -i alpine cat
wird "Hallo" gedruckt und sofort beendet, da cat
bemerkt wird, dass der Eingabestream beendet wurde und sich selbst beendet.
Wenn Sie versuchen, docker ps
nachdem Sie einen der oben genannten Schritte beendet haben, werden Sie keine laufenden Container finden. In beiden Fällen hat sich cat
selbst beendet, so dass Docker den Container beendet hat.
Für "-t" teilt dies dem Hauptprozess im Docker mit, dass seine Eingabe ein Endgerät ist.
So
docker run -t alpine cat
gibt Ihnen eine leere Zeile, aber wenn Sie versuchen, "Hallo" einzugeben, erhalten Sie kein Echo. Dies liegt daran cat
, dass dieser Eingang zwar mit einem Klemmeneingang verbunden ist, jedoch nicht mit Ihrem Eingang. Das "Hallo", das Sie eingegeben haben, hat die Eingabe von nicht erreicht cat
. cat
wartet auf Eingaben, die nie eintreffen.
echo "hello" | docker run -t alpine cat
gibt Ihnen auch eine leere Zeile und verlässt den Container nicht weiter CTRL- Daber Sie erhalten kein Echo "Hallo", weil Sie nicht bestanden haben-i
Wenn Sie CTRL+ senden C, erhalten Sie Ihre Shell zurück. Wenn Sie es docker ps
jetzt versuchen , wird der cat
Container weiterhin ausgeführt. Dies liegt daran, dass cat
immer noch auf einen Eingabestream gewartet wird, der nie geschlossen wurde. Ich habe keine nützliche Verwendung für mich -t
allein gefunden, ohne mit kombiniert zu werden -i
.
Nun zu -it
zusammen. Dies teilt cat mit, dass sein Eingang ein Terminal ist, und verbindet gleichzeitig dieses Terminal mit dessen Eingang docker run
ein Terminal ist. docker run/exec
wird sicherstellen, dass seine eigene Eingabe tatsächlich ein tty ist, bevor sie an übergeben wird cat
. Aus diesem Grund erhalten Sie eine, input device is not a TTY
wenn Sie es versuchen, echo "hello" | docker run -it alpine cat
da in diesem Fall die Eingabe von sich docker run
selbst die Pipe des vorherigen Echos ist und nicht das Terminal, an dem sie docker run
ausgeführt wird
Schließlich, warum sollten Sie bestehen müssen, -t
wenn -i
Sie den Trick tun, Ihre Eingabe mit cat
der Eingabe zu verbinden? Dies liegt daran, dass Befehle die Eingabe anders behandeln, wenn es sich um ein Terminal handelt. Dies lässt sich auch am besten anhand eines Beispiels veranschaulichen
docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -u root -p
gibt Ihnen eine Passwortabfrage. Wenn Sie das Passwort eingeben, werden die Zeichen sichtbar gedruckt.
docker run -i alpine sh
gibt Ihnen eine leere Zeile. Wenn Sie einen Befehl ls
eingeben, wie Sie eine Ausgabe erhalten, erhalten Sie jedoch keine Eingabeaufforderung oder farbige Ausgabe.
In den letzten beiden Fällen Sie dieses Verhalten, weil mysql
auch shell
nicht der Eingang als tty Behandlung und somit nicht tty spezifisches Verhalten wie die Eingangs Maskierung oder die Ausgabe verwendet haben Färbung.
-it
Flags.