So trennen Sie sich von einem Docker-Container, ohne ihn zu stoppen

0
328

Docker-Container verfügen über einen interaktiven Modus, mit dem Sie Ihr Terminal anhängen können’ s Eingabe- und Ausgabeströme zum Prozess des Containers. Durch Drücken von Strg-C wird dieser
-Prozess normalerweise beendet, wodurch der Container angehalten wird. So trennen Sie sich von einer Sitzung, ohne den Container zu stoppen.

Trennung ohne Stoppen

Docker unterstützt eine Tastaturkombination zum eleganten Trennen von einem Container. Drücken Sie Strg-P, gefolgt von Strg-Q, um Ihre Verbindung zu trennen.

Sie werden zurück in Ihre Shell verschoben, aber der zuvor angehängte Prozess bleibt am Leben und hält Ihren Container am Laufen. Sie können dies überprüfen, indem Sie docker ps verwenden, um eine Liste der ausgeführten Container abzurufen.

Durch Drücken von Strg-C oder Ausführen des Exit-Befehls wird der Vordergrundprozess des Containers normalerweise beendet, es sei denn, er wurde speziell konfiguriert. Ein Docker-Container muss einen laufenden Vordergrundprozess haben; ein Container ohne einen wird in den gestoppten Zustand versetzt.

Ändern der Tastatursequenz zum Trennen

Sie können die Sequenz zum Trennen entsprechend ändern Ihre Präferenz oder vermeiden Sie einen Konflikt mit Tastenkombinationen, die von Ihrer Anwendung berücksichtigt werden. Fügen Sie Ihrer Datei ~/.docker/config.json eine detachKeys-Eigenschaft hinzu, um die Schlüssel anzugeben, die Sie verwenden möchten.

Werbung

Docker unterstützt die Zeichen a-z und die Symbole @, ^ und _ sowie die linke Klammer ([) und zwei umgekehrte Schrägstriche (\). Diese werden alle in Verbindung mit der Strg-Taste verwendet; Buchstaben können auch einzeln ohne Strg verwendet werden.

Tastenfolgen werden als kommagetrennte Liste dargestellt:

{ "detachKeys": "Strg-d,d" }

Dieses Beispiel würde sich vom Container trennen, wenn Sie Strg-D drücken, unmittelbar gefolgt von der Taste d.

Ändern der Reihenfolge pro Container

Abgesehen von der Änderung Ihrer globalen Konfiguration akzeptiert Docker DetachKeys-Überschreibungen pro Container und pro Anhang. Fügen Sie das Flag –detach-keys zu Befehlen hinzu, die an Containerprozesse angehängt werden können, um eine bestimmte Reihenfolge festzulegen.

Die Befehle, die dies unterstützen, sind:

  • docker run
  • Docker-Start
  • Docker-Exec
  • Docker-Attach

Hier wird beschrieben, wie Sie an einen Container anhängen und dann verwenden Strg-d, gefolgt von einem Unterstrich zum Trennen:

docker attach my-container –detach-keys=”Ctrl-d,_”

Das Flag –detach-keys verwendet das gleiche Tastenfolgeformat wie die Konfigurationsoption detachKeys. Das Flag überschreibt Ihre docker.json-Einstellung; dies wiederum überschreibt Dockers standardmäßige Strg-P/Strg-Q-Sequenz.

Abtrennen, wenn die Tastatursequenz gewonnen wurde’ 8217;t Arbeit

Manchmal können Sie auf einen Containerprozess stoßen, der sich weigert, sich zu trennen, selbst wenn Sie die Tastatursequenz ausgeben. Dies kann passieren, wenn der Eingabestream des Containers nicht mit Ihrem Terminal verbunden ist (-i-Flag) oder ihm kein Pseudo-TTY zugewiesen ist (-t-Flag). Dieses Problem kann auch auftreten, wenn der Prozess Ihres Containers die Abtrennschlüsselfolge verarbeitet und Sie sie beim Anhängen nicht überschrieben haben.

Werbung

Unter diesen Umständen ist es weiterhin möglich, Ihr Terminal vom Container zu trennen. Sie müssen vorübergehend ein weiteres Shell-Fenster öffnen und es verwenden, um den docker.attach-Prozess zu beenden, 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 den Prozess docker.attach zu identifizieren, den Sie beenden 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, um diesen Prozess zu beenden:

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 jetzt die zweite Shell schließen und die ursprüngliche Shell weiter verwenden.

Diese Technik funktioniert, indem der Docker-CLI-Prozess beendet wird, der das Terminal an den Container angehängt hat, nicht den Prozess innerhalb des Containers, der ihn am Laufen hält. Ihr ursprüngliches Terminal wird wieder verwendbar und der Container bleibt oben.

Wiederanbringen an Ihren Container

Sie können Container mit dem Befehl docker attach erneut anhängen. Dadurch werden die Eingabe-, Ausgabe- und Fehlerstreams Ihres Terminals automatisch an den angegebenen Container angehängt:

docker attach my-container

Alle drei Streams sind standardmäßig verbunden. Sie können den Eingabestream weglassen, indem Sie das Flag –no-stdin übergeben. Die Ausgabe des Containers wird in Ihr Terminal gestreamt, aber Sie können keine Eingaben bereitstellen.

Werbung

Verwenden Sie erneut die Tastatursequenz, um die Verbindung zu trennen, oder Strg-C, um den Prozess und den Container zu stoppen. Wenn Sie Strg-C verwenden oder beenden, setzt Docker Attach das $? -Variable in Ihrer Shell korrekt, damit Sie den Exit-Code des Containers überprüfen können.

Zusammenfassung

Der richtige Weg zum Trennen von einem Docker-Container ist ziemlich obskure Tastatursequenz, die Sie zurück in Ihre Shell fallen lässt. Sie können diese Sequenz anpassen, um die Einprägsamkeit zu erhöhen und Konflikte mit der Tastaturhandhabung Ihres Containers zu vermeiden.

Tastaturtrennsequenzen können unter bestimmten Umständen unwirksam sein. Es ist immer noch möglich, sich von Ihrem Container zu trennen, indem Sie den Prozess identifizieren und beenden, der den Anhang unterstützt. In diesem Szenario sollten reguläre Unix-Befehle wie ps und kill verwendet werden.

Wenn Sie schließlich möchten, dass Ihr Container dauerhaft getrennt wird, starten Sie ihn mit dem Flag -d (docker run -d my-image: neueste). Dadurch wird der Container direkt in den Hintergrund geschickt und keine Ausgabe an Ihre Shell ausgegeben. Getrennte Container sind mit dem Befehl docker ps immer sichtbar und können mit docker stop my-container gestoppt werden.