Späte Antwort, könnte aber jemandem helfen
docker run/exec -i
verbindet die STDIN des Befehls im Container mit der STDIN des Befehls docker run/exec
.
So
docker run -i alpine cat
gibt Ihnen eine leere Zeile für die Eingabe. Tippe "hallo", du bekommst ein Echo "hallo". Der Container wird erst beendet, wenn Sie STRG + D senden, da der Hauptprozess cat
auf die Eingabe aus dem unendlichen Stream wartet, der die Terminaleingabe von ist docker run
.
- Auf der anderen Seite
echo "hello" | docker -i run alpine cat
wird "Hallo" gedruckt und sofort beendet, da cat
festgestellt wird, dass der Eingabestream beendet wurde und sich selbst beendet.
Wenn Sie docker ps
nach dem Beenden einer der oben genannten Aktionen versuchen , werden Sie keine laufenden Container finden. In beiden Fällen hat sich cat
selbst beendet, daher hat Docker den Container beendet.
Jetzt für "-t" teilt dies dem Hauptprozess im Docker mit, dass seine Eingabe ein Endgerät ist.
So
docker run -t alpine cat
wird Ihnen eine leere Zeile geben, aber wenn Sie versuchen "Hallo" einzugeben, werden Sie kein Echo bekommen. Dies liegt daran cat
, dass dieser Eingang nicht mit Ihrem Eingang verbunden ist, solange er an einen Klemmeneingang angeschlossen ist. Das von Ihnen eingegebene "Hallo" hat die Eingabe von nicht erreicht cat
. cat
wartet auf eine Eingabe, die niemals eintrifft.
echo "hello" | docker run -t alpine cat
gibt Ihnen auch eine leere Zeile und beendet den Container nicht mit STRG-D, aber Sie erhalten kein Echo "Hallo", weil Sie nicht bestanden haben -i
Wenn Sie STRG + C senden, erhalten Sie Ihre Shell zurück, aber wenn Sie es docker ps
jetzt versuchen , sehen Sie, dass der cat
Container noch ausgeführt wird. Dies liegt daran, dass cat
immer noch auf einen Eingabestream gewartet wird, der nie geschlossen wurde. Ich habe keinen nützlichen Gebrauch für das -t
alleine gefunden, ohne mit kombiniert zu werden -i
.
Nun zu -it
zweit. 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 ein, input device is not a TTY
wenn Sie es versuchen, echo "hello" | docker run -it alpine cat
da in diesem Fall die Eingabe von docker run
sich aus die Pipe des vorherigen Echos und nicht das Terminal docker run
ist, auf dem ausgeführt wird
Schließlich, warum sollten Sie überholen müssen, -t
wenn -i
Sie Ihren Eingang mit cat
dem Eingang verbinden wollen? Dies liegt daran, dass Befehle die Eingabe unterschiedlich 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 -uroot -p
Sie erhalten eine Passwortabfrage. Wenn Sie das Kennwort eingeben, werden die Zeichen sichtbar gedruckt.
docker run -i alpine sh
wird Ihnen eine leere Zeile geben. Wenn Sie einen Befehl wie ls
folgt eingeben, erhalten Sie eine Ausgabe, 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.