559 Stimmen

Wie können Sie sich an Docker-Prozessen anhängen und von ihnen lösen?

Ich kann mich an einen Docker-Prozess anhängen, aber Strg+C funktioniert nicht, um sich davon zu lösen. exit stoppt im Grunde genommen den Prozess.

Was ist der empfohlene Ablauf, um den Prozess am Laufen zu halten, gelegentlich darauf zuzugreifen, um Änderungen vorzunehmen, und dann zu trennen?

798voto

Ken Cochrane Punkte 72269

Um das Tty ohne Beenden der Shell abzukoppeln, verwenden Sie die Escape-Sequenz Strg+P gefolgt von Strg+Q. Weitere Details hier.

Zusätzliche Informationen von dieser Quelle:

  • docker run -t -i kann mit ^P^Q abgekoppelt und mit docker attach wieder angeschlossen werden
  • docker run -i kann nicht mit ^P^Q abgekoppelt werden; wird STDIN stören
  • docker run kann nicht mit ^P^Q abgekoppelt werden, kann den Client SIGKILL; kann mit docker attach wieder angeschlossen werden

206voto

czerasz Punkte 12900

Schauen Sie sich auch die Option --sig-proxy an:

docker attach --sig-proxy=false 304f5db405ec

Verwenden Sie dann Strg+C, um sich zu trennen

113voto

Colin Su Punkte 4564

Wenn Sie nur einige Änderungen an Dateien vornehmen oder Prozesse inspizieren möchten, gibt es hier eine weitere Lösung, die Sie wahrscheinlich möchten.

Sie könnten den folgenden Befehl ausführen, um einen neuen Prozess im vorhandenen Container auszuführen:

sudo docker exec -ti [CONTAINER-ID] bash

startet einen neuen Prozess mit der Bash-Shell, und Sie könnten direkt mit Strg+C daraus entkommen, es wird den ursprünglichen Prozess nicht beeinflussen.

56voto

Zenexer Punkte 17404

Um sich von einem laufenden Container zu lösen, verwenden Sie ^P^Q (Halten Sie Strg gedrückt, drücken Sie P, drücken Sie Q, lassen Sie Strg los).

Es gibt einen Haken: Dies funktioniert nur, wenn der Container mit beiden -t und -i gestartet wurde.

Wenn Sie einen laufenden Container haben, der ohne eine (oder beide) dieser Optionen gestartet wurde, und Sie mit docker attach anhängen, müssen Sie eine andere Möglichkeit zum Ablösen finden. Je nach den von Ihnen gewählten Optionen und dem Programm, das ausgeführt wird, kann ^C funktionieren oder den gesamten Container beenden. Sie müssen experimentieren.

Noch ein Haken: Abhängig von den Programmen, die Sie verwenden, könnte Ihr Terminal, Shell, SSH-Client oder Multiplexer entweder ^P oder ^Q abfangen (normalerweise letzteres). Um zu testen, ob dies das Problem ist, versuchen Sie, mit dem Argument --detach-keys z auszuführen oder anzuhängen. Sie sollten jetzt in der Lage sein, sich durch Drücken von z ohne Modifikatoren abzulösen. Wenn dies funktioniert, interferiert ein anderes Programm. Der einfachste Weg, dieses Problem zu umgehen, besteht darin, Ihre eigene Ablösesequenz mit dem Argument --detach-keys festzulegen. (Um beispielsweise mit ^K zu beenden, verwenden Sie --detach-keys 'ctrl-k'.) Alternativ können Sie versuchen, das Abfangen der Tasten in Ihrem Terminal oder einem anderen störenden Programm zu deaktivieren. Beispielsweise können stty start '' oder stty start undef das Terminal auf einigen POSIX-Systemen daran hindern, ^Q abzufangen, obwohl ich dies nicht hilfreich gefunden habe.

53voto

Nan Xiao Punkte 15463

Ich denke, das sollte von der Situation abhängen. Nehmen Sie den folgenden Container als Beispiel:

# docker run -it -d ubuntu
91262536f7c9a3060641448120bda7af5ca812b0beb8f3c9fe72811a61db07fc
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         vor 5 Sekunden       An 4 Sekunden                         serene_goldstine

(1) Verwenden Sie "docker attach" um den Container anzuhängen:

Da "docker attach" kein neues tty zuweisen wird, sondern das Original-TTY wiederverwendet, wird bei Ausführung des Befehls exit der laufende Container beendet:

# docker attach 91262536f7c9
exit
exit
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         vor 39 Minuten      Beendet (0) vor 3 Sekunden                    serene_goldstine

Also, es sei denn, Sie wollen wirklich, dass der laufende Container beendet wird, sollten Sie Strg+P + Strg+Q verwenden.

(2) Verwenden Sie "docker exec"

Da "docker exec" ein neues tty zuweisen wird, denke ich, dass Sie exit anstelle von Strg+P + Strg+Q verwenden sollten.

Im Folgenden wird Strg+P + Strg+Q verwendet, um den Container zu beenden:

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss   04:03   0:00 bash
root        28  0.0  0.0  15564  1148 ?        R+   04:03   0:00 ps -aux
root@91262536f7c9:/# echo $$
15

Dann melden Sie sich erneut im Container an, Sie werden sehen, dass der bash Prozess aus dem vorherigen docker exec Befehl noch aktiv ist (PID ist 15):

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss+  04:03   0:00 bash
root        29  0.0  0.0  18164  1888 ?        Ss   04:04   0:00 bash
root        42  0.0  0.0  15564  1148 ?        R+   04:04   0:00 ps -aux
root@91262536f7c9:/# echo $$
29

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