468 Stimmen

Richtige Art, sich von einem Container zu lösen, ohne ihn anzuhalten

In Docker 1.1.2 (latest), what's the correct way to detach from a container without stopping it?

So for example, if I try:

  • docker run -i -t foo /bin/bash or
  • docker attach foo (for already running container)

both of which get me to a terminal in the container, how do I exit the container's terminal without stopping it?

exit and CTR+C both stop the container.

687voto

Larry Cai Punkte 49911

Geben Sie Strg+p ein, dann Strg+q. Es hilft Ihnen, den interaktiven Modus in den Daemon-Modus zu wechseln.

Siehe im Abschnitt Standard-Tastensequenz zum Abtrennen von Containern, der besagt:

Sobald Sie an einen Container angehängt sind, trennen Sie sich von ihm und lassen ihn mit der Tastensequenz STRG-p STRG-q laufen. Diese Abtrenntastensequenz kann mithilfe der Eigenschaft detachKeys angepasst werden. [...]

241voto

Regan Punkte 8451

Aktualisierung: Wie in den folgenden Antworten erwähnt, wird durch Strg+p, Strg+q der interaktive Modus nun in den Daemon-Modus umgeschaltet.


Nun, Strg+C (oder Strg+\) sollte Sie zwar aus dem Container abmelden, aber er wird den Container beenden, da Ihr Hauptprozess ein Bash-Prozess ist.

Eine kleine Lektion über Docker. Der Container ist kein echtes voll funktionsfähiges Betriebssystem. Wenn Sie einen Container starten, übernimmt der gestartete Prozess die PID 1 und nimmt die Funktion eines Init-Prozesses an. Also, wenn dieser Prozess beendet wird, stoppt der Daemon den Container, bis ein neuer Prozess gestartet wird (über docker start) (Weitere Erklärungen dazu finden Sie unter http://phusion.github.io/baseimage-docker/#intro)

Wenn Sie einen Container wollen, der die ganze Zeit im Hintergrund läuft, schlage ich vor, dass Sie Folgendes verwenden

docker run -d foo

Mit einem ssh-Server im Container. (Der einfachste Weg ist, dem Dockerizing-Openssh-Tutorial zu folgen https://docs.docker.com/engine/examples/running_ssh_service/)

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

docker start foo

(es wird standardmäßig im Hintergrund laufen)

232voto

berto Punkte 7757

Ich habe das überprüft und alle oben genannten Antworten sind teilweise richtig. Es hängt alles davon ab, wie der Container gestartet wurde. Es kommt darauf an, wie der Container gestartet wurde:

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

^P^Q funktioniert, ABER nur wenn -t und -i verwendet wurden, um den Container zu starten:

[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
# hier habe ich ^P^Q getippt
Lesesequenz wird eingelesen

# ich bin zurück an meiner Eingabeaufforderung
[berto@g6]$ docker kill test; docker rm -v test
test
test

ctrl+c funktioniert, ABER nur wenn -t (ohne -i) verwendet wurde, um den Container zu starten:

[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 zum Abtrennen

Es gibt einen Weg, um sich abzutrennen, ohne den Container zu beenden; Sie benötigen dazu eine andere Shell. Zusammenfassend, wenn Sie dies in einer anderen Shell ausführen, wird der Container abgetrennt und läuft weiter pkill -9 -f 'docker.*attach': (NB! das -9 für sigkill ist entscheidend, um den "attach" Prozess davon abzuhalten, das Signal an den laufenden Container weiterzugeben.)

[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
# hier habe ich ^P^Q getippt und es funktioniert nicht
^P
# ctrl+c funktioniert auch nicht
^C
# kann auch nicht in den Hintergrund versetzen
^Z

# gehen Sie zu einer anderen Shell und führen Sie den `pkill` Befehl aus

# ich bin zurück an meiner Eingabeaufforderung
[berto@g6]$

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

50voto

Ashwin Punkte 2725

Wenn Sie "docker attach "Container-ID" ausführen, gelangen Sie in den Container. Um den Container zu verlassen, ohne ihn zu stoppen, müssen Sie Strg + P + Q eingeben

36voto

PiersyP Punkte 4713

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


Ich würde gerne eine weitere Option hinzufügen, nämlich den Container wie folgt auszuführen

docker run -dti foo bash

Dann kannst du in den Container gehen und bash ausführen mit

docker exec -ti ID_von_foo bash

Keine Notwendigkeit, sshd zu installieren :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X