Docker-Container verfügen über einen interaktiven Modus, mit dem Sie die Eingabe- und Ausgabestreams Ihres Terminals an den Prozess des Containers anhängen können. Durch Drücken von Strg-C wird dieser
Prozess normalerweise beendet, wodurch der Container angehalten wird. So können Sie sich von einer Sitzung trennen, ohne den Container zu stoppen.
Trennen ohne anzuhalten
Docker unterstützt eine Tastaturkombination, um sich elegant von einem Container zu trennen. Drücken Sie Strg-P, gefolgt von Strg-Q, um die Verbindung zu trennen.
Sie werden in Ihre Shell zurückversetzt, aber der zuvor angehängte Prozess bleibt am Leben und hält Ihren Container am Laufen. Sie können dies mit docker ps
überprüfen um eine Liste der laufenden Container zu erhalten.
Drücken Sie Strg-C oder führen Sie exit
aus Der Befehl beendet normalerweise den Vordergrundprozess des Containers, es sei denn, er wurde speziell konfiguriert. Ein Docker-Container muss einen laufenden Vordergrundprozess haben; ein Container ohne einen wird in den gestoppten Zustand wechseln.
Ändern der Tastatursequenz zum Trennen
Sie können die Trennungssequenz nach Ihren Wünschen ändern oder Konflikte mit Tastaturkürzeln vermeiden, die von Ihrer Anwendung berücksichtigt werden. Fügen Sie einen detachKeys
hinzu -Eigenschaft zu Ihrer ~/.docker/config.json
Datei, um die Schlüssel anzugeben, die Sie verwenden möchten.
Docker unterstützt den a-z
Zeichen und @
, ^
, und _
, Symbole sowie das linke Klammerzeichen ([
) und zwei Backslashes (\
). Diese werden alle in Verbindung mit Ctrl-
verwendet Schlüssel; Buchstaben können auch einzeln verwendet werden, ohne Ctrl
.
Tastenfolgen werden als durch Kommas getrennte Liste ausgedrückt:
{ "detachKeys": "Ctrl-d,d" }
Dieses Beispiel würde sich vom Container lösen, wenn Sie Ctrl-D
drücken unmittelbar gefolgt von d
Schlüssel.
Ändern der Sequenz auf Containerbasis
Über das Ändern Ihrer globalen Konfiguration hinaus akzeptiert Docker detachKeys
Überschreibungen pro Container und pro Anhang. Fügen Sie die --detach-keys
hinzu Flag für Befehle, die an Containerprozesse angehängt werden können, um eine bestimmte Sequenz festzulegen.
Die Befehle, die dies unterstützen, sind:
docker run
docker start
docker exec
docker attach
Hier erfahren Sie, wie Sie an einen Container anhängen und dann Ctrl-d
verwenden , gefolgt von einem Unterstrich, zum Trennen:
docker attach my-container --detach-keys="Ctrl-d,_"
Die --detach-keys
flag verwendet dasselbe Tastensequenzformat wie detachKeys
Konfigurationsoption. Das Flag überschreibt Ihre docker.json
Einstellung; dies überschreibt wiederum die standardmäßige Strg-P/Strg-Q-Sequenz von Docker.
Trennen, wenn die Keyboard-Sequenz nicht funktioniert
Manchmal stoßen Sie möglicherweise auf einen Containerprozess, der sich weigert, sich zu trennen, selbst wenn Sie die Tastatursequenz eingeben. Dies kann passieren, wenn der Eingabestream des Containers nicht mit Ihrem Terminal verbunden ist (-i
Flag) oder es ist kein Pseudo-TTY zugewiesen (-t
Flagge). Sie könnten auch auf dieses Problem stoßen, wenn der Prozess Ihres Containers die Schlüsselsequenz zum Trennen verarbeitet und Sie sie beim Anhängen nicht überschrieben haben.
Unter diesen Umständen ist es immer noch möglich, Ihr Terminal vom Container zu trennen. Sie müssen vorübergehend ein anderes Shell-Fenster öffnen und es verwenden, um docker.attach
zu beenden Prozess, der den Anhang aktiv hält.
Suchen Sie zuerst die Prozess-ID des Anhangsprozesses:
ps -ef | grep attach
Verwenden Sie die Ausgabe von ps
um docker.attach
zu identifizieren Prozess, den Sie töten müssen. Der Befehl in der CMD
Spalte sollte den gesuchten Anhang identifizieren. Notieren Sie sich die entsprechende PID-Nummer und verwenden Sie den kill
Befehl zum Beenden dieses Prozesses:
kill -9 <PID>
Sie sollten sehen, dass sich Ihre ursprüngliche Shell von Ihrem Docker-Container löst und in einen normalen Betriebszustand zurückkehrt. Sie können nun die zweite Shell schließen und die ursprüngliche weiterverwenden.
Diese Technik funktioniert, indem der Docker-CLI-Prozess beendet wird, der das Terminal an den Container angehängt hat, und nicht der Prozess innerhalb des Containers, der ihn am Laufen hält. Ihr ursprüngliches Terminal wird wieder nutzbar und der Container bleibt bestehen.
Wiederanhängen an Ihren Container
Sie können Container mit docker attach
erneut anhängen Befehl. Dadurch werden die Eingabe-, Ausgabe- und Fehlerströme Ihres Terminals automatisch an den angegebenen Container angehängt:
docker attach my-container
Alle drei Streams sind standardmäßig verbunden. Sie können den Eingabestrom weglassen, indem Sie --no-stdin
übergeben Flagge. Die Ausgabe des Containers wird in Ihr Terminal gestreamt, aber Sie können keine Eingabe liefern.
Verwenden Sie zum Trennen erneut die Tastenkombination oder Ctrl-C
um den Prozess und Container zu stoppen. Wenn Sie Ctrl-C
verwenden oder exit
, docker attach
setzt den $?
Variable in Ihrer Shell richtig, damit Sie den Exit-Code des Containers überprüfen können.
Zusammenfassung
Der richtige Weg, sich von einem Docker-Container zu trennen, ist eine ziemlich obskure Tastatursequenz, die Sie zurück in Ihre Shell bringt. Sie können diese Sequenz anpassen, um die Merkfähigkeit zu erhöhen und Konflikte mit der Tastaturbedienung Ihres Containers zu vermeiden.
Tastaturtrennsequenzen können unter bestimmten Umständen wirkungslos sein. Es ist immer noch möglich, sich von Ihrem Container zu lösen, indem Sie den Prozess identifizieren und beenden, der den Anhang unterstützt. Normale Unix-Befehle wie ps
und kill
sollte in diesem Szenario verwendet werden.
Wenn Sie schließlich möchten, dass Ihr Container dauerhaft getrennt wird, starten Sie ihn mit -d
Flag (docker run -d my-image:latest
). Dies schickt den Container direkt in den Hintergrund und gibt keine Ausgabe an Ihre Shell aus. Getrennte Container sind immer mit dem docker ps
sichtbar Befehl und kann mit docker stop my-container
gestoppt werden .