Richtige Lösung zum Abnehmen von einem Behälter, ohne ihn anzuhalten


313

Was ist in Docker 1.1.2 (aktuell) der richtige Weg, um sich von einem Container zu lösen, ohne ihn anzuhalten?

Also zum Beispiel, wenn ich es versuche:

  • docker run -i -t foo /bin/bash oder
  • docker attach foo (für bereits laufenden Container)

Beide bringen mich zu einem Terminal im Container. Wie verlasse ich das Terminal des Containers, ohne es anzuhalten?

exitund CTR+Cbeide stoppen den Container.


Der "Container" ist nur eine Reihe von eingeschränkten Namespaces (ein Prozessnamespace, ein Dateisystem-Namespace usw.), in denen Prozesse ausgeführt werden können. Wenn Sie keinen Prozess in einem Namespace haben, gibt es diesen Namespace wirklich? Es ist nicht wie bei einer virtuellen Maschine, bei der ein Kernel auf Taktunterbrechungen usw. reagiert. ungeachtet.
Charles Duffy

Antworten:


166

Update: Wie unten in den Antworten Ctrl+ p, Ctrl+ erwähnt, qwird der interaktive Modus jetzt in den Daemon-Modus umgewandelt.


Nun, Ctrl+ C(oder Ctrl+ \) sollte Sie vom Container trennen, aber es wird den Container töten, weil Ihr Hauptprozess eine Bash ist.

Eine kleine Lektion über Docker. Der Container ist kein echtes voll funktionsfähiges Betriebssystem. Wenn Sie einen Container ausführen, nimmt der von Ihnen gestartete Prozess die PID 1 und übernimmt die Init-Leistung. Wenn dieser Prozess beendet wird, stoppt der Daemon den Container, bis ein neuer Prozess gestartet wird (über Docker-Start) (Weitere Erläuterungen zu diesem Thema http://phusion.github.io/baseimage-docker/#intro ).

Wenn Sie einen Container möchten, der die ganze Zeit im getrennten Modus ausgeführt wird, empfehle ich die Verwendung

docker run -d foo

Mit einem SSH-Server auf dem Container. (Am einfachsten folgen Sie dem Dockerizing-OpenSh-Tutorial https://docs.docker.com/engine/examples/running_ssh_service/ )

Oder Sie können Ihren Container einfach über neu starten

docker start foo

(wird standardmäßig getrennt)


3
+1 für Basisbild-Docker. Es ist schön zu wissen, dass es eine Vorlage mit Ratschlägen zu den schwierigen Teilen von Docker gibt.
Mtmacdonald

Beachten Sie, dass ssh nicht unbedingt erforderlich ist: blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker
Adrian Mouat

1
Das Ausführen eines im -d-Modus enthaltenen Modus war sehr hilfreich. Auch der Link zum Starten von ssh über Dockerfile hat mir das Leben leichter gemacht.
Ravi

56
Detach mit Strg-P, Ctrl-Q. Der Rat dieser Antwort wird einen Container töten.
Taranaki

4
Dies hat bei mir funktioniert (aus der Antwort unten): Beginnen Sie mit -ti -d, hängen Sie dann an docker attach, trennen Sie dann mit zuerst Strg + P und dann Strg + Q. Ich dachte, ich könnte nur eine der Tastaturkürzel verwenden.
CGFoX

526

Geben Sie Ctrl+ pdann Ctrl+ ein q. Es wird Ihnen helfen, den interaktiven Modus in den Dämonmodus zu versetzen.

Siehe https://docs.docker.com/v1.7/articles/basics/#running-an-interactive-shell .

# To detach the tty without exiting the shell,
# use the escape sequence Ctrl-p + Ctrl-q
# note: This will continue to exist in a stopped state once exited (see "docker ps -a")

4
Es scheint nicht zu funktionieren mit (Versuch, einen angeschlossenen Wekan-Container zu verlassen).
Gefahr89

7
Ich habe diese Seite so oft besucht, weil ich mich nicht genau an diese Tastenkombination erinnern konnte! :-D
Thamme Gowda

10
@ gefährliche89 Strg-P, Strg-Q funktioniert nur, wenn Sie Ihren Container mit dem interaktiven Modus (-it) gestartet haben. Wenn Sie es im Deamon-Modus (-d) gestartet und daran angehängt haben, können Sie es einfach beenden und es wird weiterhin im Hintergrund ausgeführt.
Riscie

1
@SlimShady Drücken Sie Strg + P und dann Strg + Q, um den Vorgang zu beenden. Nicht einer von ihnen, sondern beide in dieser Reihenfolge.
Mohyaddin Alaoddin

160

Ich habe mich damit befasst und alle obigen Antworten sind teilweise richtig. Es hängt alles davon ab, wie der Container gestartet wird. Beim Start des Containers kommt es auf Folgendes an:

  • wurde ein TTY zugewiesen ( -t)
  • wurde stdin offen gelassen ( -i)

^P^Q funktioniert, ABER nur wenn -tund -izum Starten des Containers verwendet wird:

[berto@g6]$ docker run -ti -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q
read escape sequence

# i'm back to my prompt
[berto@g6]$ docker kill test; docker rm -v test
test
test

ctrl+c funktioniert, ABER nur, wenn -t( ohne -i ) zum Starten des Containers verwendet wird:

[berto@g6]$ docker run -t -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
018a228c96d6bf2e73cccaefcf656b02753905b9a859f32e60bdf343bcbe834d

[berto@g6]$ docker attach test
^C

[berto@g6]$    

Der dritte Weg, sich zu lösen

Es gibt jedoch eine Möglichkeit, sich zu lösen, ohne den Container zu töten. Du brauchst eine andere Hülle. Zusammenfassend lässt sich sagen, dass das Ausführen in einer anderen Shell getrennt wurde und der Container ausgeführt wurde pkill -9 -f 'docker.*attach':

[berto@g6]$ docker run -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q and doesn't work
^P
# ctrl+c doesn't work either
^C
# can't background either
^Z

# go to another shell and run the `pkill` command above

# i'm back to my prompt
[berto@g6]$

Warum? Weil Sie den Prozess beenden, der Sie mit dem Container verbunden hat, nicht den Container selbst.


2
Der dritte Weg funktioniert bei mir. Vielen Dank. Wenn Sie eine Verbindung zu mehreren Instanzen herstellen und nur von einer trennen möchten. Kann den spezifischen Prozess beenden: ps -ef | grep attach -> pid bekommen. Dann: töte -9 <pid>
phanhuy152

pkill ist das einzige, was für mich nach Docker
Attach

Warum brauchen wir die -9. Mir ist aufgefallen, dass der Container heruntergefahren wird, wenn wir den -9 nicht verwenden.
Angelo

Andere Signale sind das, Signale. Sie teilen dem Prozess mit, um welche Art von Signal es sich handelt, und geben ihm die Möglichkeit, zu handeln und etwas zu tun. Das kill -9Signal nicht. Der Prozess wird beendet und kann nicht in Anspruch genommen werden. Ich vermute, dass andere Signale dem Container die Möglichkeit geben, herunterzufahren, während -9dies nicht der Fall ist.
Berto

1
Das war super hilfreich. Vielen Dank!
Evan Zamir

40

Wenn Sie "Docker anhängen" Container-ID ", gelangen Sie in den Container. Um den Container zu verlassen, ohne den Container anzuhalten, müssen Sie Ctrl+ P+ eingebenQ


6
besser zu Strg + P und Strg + Q
sib10

4
Strg + P, Q (hält immer noch Strg);)
Dimpiax

es gibt mich zurück:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Webwoman

31

Ich halte Ashwins Antwort für die richtigste, meine alte Antwort ist unten.


Ich möchte hier eine weitere Option hinzufügen, die darin besteht, den Container wie folgt auszuführen

docker run -dti foo bash

Sie können dann den Container betreten und Bash mit ausführen

docker exec -ti ID_of_foo bash

Keine Notwendigkeit, sshd zu installieren :)


Ich denke, im zweiten Befehl müssen Sie foo durch die Container-ID von foo ersetzen
Nehal J Wani

In diesem Zusammenhang denke ich, docker attachdass es mehr Standard wäre, wenn man es wieder mit dem ersten Bash-Lauf verbindet. docker execfunktioniert auch hier, erstellt jedoch zusätzlich zum ersten einen neuen Bash-Prozess. Sicher, der Prozess wird im selben Kontext / derselben Umgebung / demselben Container wie der erste erstellt, es ist jedoch ein anderer (eine Analogie wäre, eine neue Terminal-Registerkarte in Ihrem bevorzugten Terminal-Emulator zu öffnen).
Thiagowfx


16

Wenn Sie eine Verbindung hergestellt haben docker attach, können Sie die Verbindung trennen, indem Sie den Docker-Verbindungsprozess beenden. Besser ist es, den Parameter sig-proxy zu verwenden, um zu vermeiden, dass Strg + C an Ihren Container übergeben wird:

docker attach --sig-proxy=false [container-name]

Dieselbe Option ist für den docker runBefehl verfügbar .


6
Obwohl --sig-proxy = false äußerst nützlich ist, funktioniert es nicht für bereits angehängte Container, für die es nicht angegeben wurde. Das Problem ist, dass es nach dem Anhängen KEINE Möglichkeit gibt, die Verbindung zu trennen, ohne den Prozess abzubrechen, einschließlich "Beenden des Docker-Anhängeprozesses". Cp, Cq funktioniert nicht mit angehängten Containern, sondern nur mit interaktiven (wie in der Frage verwendet).
Taranaki

1
Dies sollte die akzeptierte Antwort sein, einschließlich @taranakis Kommentar, Strg + P, Q funktioniert nicht fürphp:7.3-apache
MKaama

10

Wenn Sie nur die Ausgabe des Prozesses sehen möchten, der aus dem Container ausgeführt wird, können Sie eine einfache Aktion ausführen docker container logs -f <container id>.

Das -fFlag macht es so, dass die Ausgabe des Containers followedin Echtzeit aktualisiert wird. Sehr nützlich zum Debuggen oder Überwachen.


8

Sie können die --detach-keysOption beim Ausführen verwenden docker attach, um die Standardsequenz CTRL+ P, CTRL+ zu überschreiben Q(das funktioniert nicht immer).

Wenn Sie beispielsweise laufen docker attach --detach-keys="ctrl-a" testund CTRL+ drücken, verlassen ASie den Container, ohne ihn zu beenden.

Andere Beispiele:

  • docker attach --detach-keys="ctrl-a,x" test- Drücken Sie CTRL+Aund dann Xzum Beenden
  • docker attach --detach-keys="a,b,c" test- Drücken Sie Adann Bund dann, Cum das Menü zu verlassen

Auszug aus der offiziellen Dokumentation:

Wenn Sie möchten, können Sie eine Überschreibung der Docker-Schlüsselsequenz zum Trennen konfigurieren. Dies ist nützlich, wenn die Docker-Standardsequenz mit der für andere Anwendungen verwendeten Schlüsselsequenz in Konflikt steht. Es gibt zwei Möglichkeiten, Ihre eigene Trennungsschlüsselsequenz zu definieren, als Überschreibung pro Container oder als Konfigurationseigenschaft für Ihre gesamte Konfiguration.

Verwenden Sie das --detach-keys="<sequence>"Flag mit dem Docker-Befehl attach, um die Sequenz für einen einzelnen Container zu überschreiben . Das Format von <sequence>ist entweder ein Buchstabe [a-Z]oder ctrl-kombiniert mit einem der folgenden Elemente:

  • az (ein einzelnes Alpha-Zeichen in Kleinbuchstaben)
  • @ (am Schild)
  • [ (linke Klammer)
  • \ (zwei Schrägstriche)
  • _ (Unterstrich)
  • ^ (Caret)

Diese a, ctrl-a, X, oder ctrl-\\Werte sind Beispiele für gültige Tastenfolgen. Informationen zum Konfigurieren einer anderen Standardschlüsselreihenfolge für alle Container finden Sie im Abschnitt Konfigurationsdatei .

Hinweis: Dies funktioniert seit Docker Version 1.10+ (zum Zeitpunkt dieser Antwort ist die aktuelle Version 18.03).


0

Alter Beitrag, aber einfach beenden und dann erneut starten ... Das Problem ist, wenn Sie sich auf einem Windows-Computer befinden. Strg + oder Strg + P sind an den Druck gebunden. Beim Verlassen des Starts sollte der Container nichts verletzen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.