Späte Antwort, könnte aber jemandem helfen
docker run/exec -iverbindet die STDIN des Befehls im Container mit der STDIN des docker run/execselbst.
So
docker run -i alpine catgibt 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 catauf die Eingabe aus dem unendlichen Stream wartet, der die Terminaleingabe des ist docker run.
- Auf der anderen Seite
echo "hello" | docker run -i alpine catwird "Hallo" gedruckt und sofort beendet, da catbemerkt wird, dass der Eingabestream beendet wurde und sich selbst beendet.
Wenn Sie versuchen, docker psnachdem Sie einen der oben genannten Schritte beendet haben, werden Sie keine laufenden Container finden. In beiden Fällen hat sich catselbst 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 catgibt 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. catwartet auf Eingaben, die nie eintreffen.
echo "hello" | docker run -t alpine catgibt 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 psjetzt versuchen , wird der catContainer weiterhin ausgeführt. Dies liegt daran, dass catimmer noch auf einen Eingabestream gewartet wird, der nie geschlossen wurde. Ich habe keine nützliche Verwendung für mich -tallein gefunden, ohne mit kombiniert zu werden -i.
Nun zu -itzusammen. Dies teilt cat mit, dass sein Eingang ein Terminal ist, und verbindet gleichzeitig dieses Terminal mit dessen Eingang docker runein Terminal ist. docker run/execwird 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 TTYwenn Sie es versuchen, echo "hello" | docker run -it alpine catda in diesem Fall die Eingabe von sich docker runselbst die Pipe des vorherigen Echos ist und nicht das Terminal, an dem sie docker runausgeführt wird
Schließlich, warum sollten Sie bestehen müssen, -twenn -iSie den Trick tun, Ihre Eingabe mit catder 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 -pgibt Ihnen eine Passwortabfrage. Wenn Sie das Passwort eingeben, werden die Zeichen sichtbar gedruckt.
docker run -i alpine shgibt Ihnen eine leere Zeile. Wenn Sie einen Befehl lseingeben, wie Sie eine Ausgabe erhalten, erhalten Sie jedoch keine Eingabeaufforderung oder farbige Ausgabe.
In den letzten beiden Fällen Sie dieses Verhalten, weil mysqlauch shellnicht der Eingang als tty Behandlung und somit nicht tty spezifisches Verhalten wie die Eingangs Maskierung oder die Ausgabe verwendet haben Färbung.
-itFlags.