Wie können Sie den Docker-Prozess anhängen und von ihm trennen?

457

Ich kann an einen Docker-Prozess anhängen, aber Ctrl+ cfunktioniert nicht, um sich von ihm zu trennen. exitstoppt im Grunde den Prozess.

Was ist der empfohlene Workflow, um den Prozess auszuführen, gelegentlich eine Verbindung herzustellen, um einige Änderungen vorzunehmen, und dann die Verbindung zu trennen?

MarkL
quelle
4
Bei Verwendung von nsenter habe ich nur Strg-D gedrückt.
user2105103
Ist Schließen xterm, konsoleetc. Arbeit? Es funktioniert bei mir (ich werde losgelöst).
Vytenis Bivainis

Antworten:

667

Verwenden Sie die Escape-Sequenz Ctrl+ Pgefolgt von Ctrl+, um das tty zu trennen, ohne die Shell zu verlassen Q. Weitere Details hier .

Zusätzliche Informationen aus dieser Quelle :

  • Docker-Lauf -t -i → kann ^P^Qmit Docker Attach getrennt und wieder angebracht werden
  • Docker-Lauf -i → kann nicht mit getrennt werden ^P^Q; wird stdin stören
  • Docker-Lauf → kann nicht mit getrennt werden ^P^Q; kann SIGKILL Client; kann mit Docker wieder anbringen
Ken Cochrane
quelle
46
Dies wäre eine großartige Antwort, wenn es tatsächlich wie in den Dokumenten beschrieben funktionieren würde.
Allingeek
20
Ich habe festgestellt, dass selbst bei Ausführung mit -it die Trennsequenz fehlschlägt, wenn Sie den Container auch mit dem Bereinigungsflag (--rm) starten. Für manche mag das offensichtlich sein, aber es beißt mich öfter, als ich zugeben möchte.
Allingeek
7
Eine andere Möglichkeit ist, einfach Ihr Terminalfenster oder cmd-w zu schließen :)
buildmaestro
3
Sie können konfigurierbare "detachKeys": "ctrl-a,a"Trennungsschlüssel festlegen, z. B. in Ihrer .docker / config.json-Datei oder --detach-keys "ctrl-a,a"in der Befehlszeile mit Anhängen usw.
Matthew Hannigan
4
Ctrl + Zlöst sich nicht ab; es ist nur ein Hintergrund für den Prozess. Es ist nicht dasselbe wie das Abnehmen und bringt eine Leistungsstrafe mit sich.
Zenexer
177

Schauen Sie sich auch die --sig-proxyOption an :

docker attach --sig-proxy=false 304f5db405ec

Verwenden Sie dann CTRL+ czum Abnehmen

czerasz
quelle
4
Um dies zu versuchen, beginnend mit Ausführen statt Anhängen, habe ich versucht: Das docker run -ti --sig-proxy=false busybox top scheint nicht zu funktionieren, der Prozess wird mit Strg-C beendet, aber beginnend mit docker run -t -sig-proxy=false busybox top schien zu funktionieren und das Beenden mit Strg-C zu ermöglichen
Henning
Ctrl-cstoppt auch den Container.
Evan Hu
Es ist die einzige Lösung von den hier aufgeführten, die für mich auf dem Debian 9-Server mit Docker 19.03.5 funktioniert. Die Frage ist, warum dies nicht die Standardeinstellung für Anhängebefehle ist. Dies scheint der häufigste Anwendungsfall zu sein.
fviktor
Die Ctrl-p-, Ctrl-q-Sequenz funktioniert bei mir nicht (gestartet als Docker-Container xyz anhängen). Dies ist jedoch der Fall. Danke @czerasz
PravyNandas
92

Wenn Sie nur Änderungen an Dateien vornehmen oder Prozesse überprüfen möchten, finden Sie hier eine weitere Lösung, die Sie wahrscheinlich wünschen.

Sie können den folgenden Befehl ausführen, um einen neuen Prozess aus dem vorhandenen Container auszuführen:

sudo docker exec -ti [CONTAINER-ID] bash

Startet einen neuen Prozess mit der Bash-Shell, und Sie können mit Ctrl+ Cdirekt davon entkommen. Dies hat keine Auswirkungen auf den ursprünglichen Prozess.

Colin Su
quelle
6
Nachdem dies funktioniert hat, können Sie "exit" eingeben, sobald Sie fertig sind, ohne den ursprünglichen Prozess zu beeinflussen.
Eko3alpha
Dies ist eine großartige Möglichkeit, um einen laufenden Container zu befestigen. Aber was ist, wenn (sagen wir) ein Prozess im Container ausgeführt wird und ich diesen Prozess neu starten möchte? Ah, ich kann einfach den alten Prozess beenden, den neuen neu starten und Cp, Cq verwenden, was funktioniert, da es ein interaktives tty ist. Ich mag auch die Methode --sig-proxy = false, aber diese ist vielseitiger und erzwingt keine Unterbrechung des aktuellen Prozesses.
Taranaki
"Anhängen" hat bei Docker eine bestimmte Bedeutung und execist es nicht.
Freitag,
48

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"         5 seconds ago       Up 4 seconds                            serene_goldstine

(1) docker attachBefestigen Sie den Behälter mit " ":

Da " docker attach" kein neues tty zuweist, sondern das ursprünglich ausgeführte tty wiederverwendet exit, wird beim Ausführen des Befehls der laufende Container beendet:

# docker attach 91262536f7c9
exit
exit
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         39 minutes ago      Exited (0) 3 seconds ago                       serene_goldstine

Wenn Sie also nicht wirklich den laufenden Container beenden möchten, sollten Sie Ctrl+ p+ Ctrl+ verwenden q.

(2) Verwenden Sie " docker exec"

Da „ docker execwird eine neue tty zuteilen, so denke ich , sollten Sie exitanstelle von Ctrl+ p+ Ctrl+ q.

Folgendes führt Ctrl+ p+ Ctrl+ aus q, 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 bashmelden Sie den Container erneut an. Sie werden sehen, dass der Prozess im vorherigen docker execBefehl 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
Nan Xiao
quelle
39

Um sich von einem laufenden Container zu lösen, verwenden Sie ^P^Q(gedrückt halten Ctrl, drücken P, drücken Q, loslassen Ctrl).

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

Wenn Sie einen laufenden Container haben, der ohne eine (oder beide) dieser Optionen gestartet wurde und mit dem docker attachSie eine Verbindung herstellen, müssen Sie einen anderen Weg zum Trennen finden. Abhängig von den von Ihnen ausgewählten Optionen und dem laufenden Programm ^Cfunktioniert dies möglicherweise oder es wird der gesamte Container zerstört. Du musst experimentieren.

Ein weiterer Haken: Abhängig von den von Ihnen verwendeten Programmen können Ihr Terminal, Ihre Shell, Ihr SSH-Client oder Ihr Multiplexer entweder ^Poder ^Q(normalerweise letzteres) abfangen . Um zu testen, ob dies das Problem ist, versuchen Sie, das --detach-keys zArgument auszuführen oder anzuhängen . Sie sollten sich jetzt durch Drücken zohne Modifikatoren trennen können. Wenn dies funktioniert, stört ein anderes Programm. Der einfachste Weg, dies zu umgehen, besteht darin, mithilfe des --detach-keysArguments eine eigene Trennsequenz festzulegen. (Zum Beenden beispielsweise ^Kverwenden --detach-keys 'ctrl-k'.) Alternativ können Sie versuchen, das Abfangen der Schlüssel in Ihrem Terminal oder einem anderen störenden Programm zu deaktivieren. Zum Beispiel stty start ''oder stty start undefkann verhindern , dass das Terminal abfängt^Q auf einigen POSIX-Systemen, obwohl ich dies nicht als hilfreich empfunden habe.

Zenexer
quelle
2
Super präzise Erklärung, wirkte wie ein Zauber
Meir Gabay
27

Wenn nichts anderes funktioniert, öffnen Sie ein neues Terminal und:

$ ps aux | grep attach
username  <pid_here>    ..............  0:00 docker attach <CONTAINER_HASH_HERE>
username  <another_pid> ..............  0:00 grep --color=auto attach
$ kill -9 <pid_here>
Adi Fatol
quelle
Was für eine Falle! Danke, das ist das einzige, was funktioniert hat. -9war nicht notwendig.
Heath Raftery
Dies tötet auch den Container - möglicherweise abhängig davon, welche Flags gesetzt wurden.
AdamAL
1
Bitte beachten Sie, wenn zwei Pids angezeigt werden, ist die erste die übergeordnete. Sie sollten die zweite PID zum Töten verwenden docker attachund nicht die übergeordnete.
Joeytwiddle
11

Zum Abnehmen vom Behälter Sie einfach halten Ctrlund drücken Sie P+ Q.

So hängen Sie an einen laufenden Container an:

$ docker container attach "container_name"
gXg
quelle
9

Ich hatte das gleiche Problem ctrl- Pund Qwürde auch nicht funktionieren ctrl- C... schließlich öffnete ich eine weitere Terminalsitzung und machte "Docker Stop ContainerID " und "Docker Start ContainerID " und es wurde die Arbeit erledigt. Seltsam.

Pierluigi Vernetto
quelle
Dies funktioniert nicht, wenn Sie den Container mit --rmflag gestartet haben . Ctrl+Pund Ctrl+Qfunktioniert, wenn Sie den Container mit -itflag gestartet haben .
Aswath K
4

In der gleichen Shell halten ctrlTaste und drücken Sie die Tasten pdannq

Ravthiru
quelle
3
Dies funktioniert nur, wenn Sie den Container mit -itflag gestartet haben .
Aswath K
2

Ich bin auf einem Mac und aus irgendeinem Grund würde Ctrl- p Ctrl- qnur funktionieren, wenn ich auch halten würdeShift

Jared Williams
quelle
1
  1. Öffnen Sie ein neues Terminal
  2. Suchen Sie die ID des laufenden Containers docker ps
  3. Töte den Container docker kill ${containerId}
Vyacheslav Cotruta
quelle
0

Um einen Docker-Prozess zu stoppen und die Ports freizugeben, verwenden Sie zuerst ctrl- cum den Container zu verlassen, und verwenden Sie dann Docker ps, um die Liste der ausgeführten Container zu finden. Anschließend können Sie den Docker-Container-Stop verwenden, um diesen Prozess zu stoppen und seine Ports freizugeben. Den Containernamen finden Sie im Docker-Befehl ps, der den Namen in der Namensspalte angibt. Hoffe das löst deine Fragen ....

Shankar
quelle
0

Wenn Sie nur den Docker-Prozess benötigen, um in den Hintergrund zu treten, können Sie ihn verwenden

Ctrl + Z

Seien Sie sich bewusst, dass es sich nicht um eine echte Ablösung handelt und dass dies mit einer Leistungsstrafe verbunden ist. (Sie können es mit dem in den Vordergrund zurücksetzenbg Befehl ).

Eine andere Möglichkeit besteht darin, Ihr Terminal zu schließen, wenn Sie es nicht mehr benötigen.

Tom
quelle
0

Für alle, die auf das gleiche Problem gestoßen sind, das ich hatte (kann nicht abgetrennt werden, ohne den Container zu töten, selbst wenn der Ablöseschlüssel gesetzt wurde) ......

Beim Starten Ihrer Container mit docker-compose up -d

anstatt docker attach {container name}das Tailing-Protokoll anzuzeigen ....

versuchen docker-compose logs -f {service name} ctrl- ctötet den Holzschwanz, ohne Ihren Container zu töten

{service name}Dies ist der Dienst, der in der Datei docker-compose.yml aufgeführt ist. (z . B. während Containername = elk_logstash_1 -> Dienstname = logstash

HTH

Lon Kaut
quelle
0

Aktualisieren

Normalerweise habe ich Docker Attach verwendet, um zu sehen, was STDOUT anzeigt, um Container zu beheben. Ich habe gerade gefundendocker logs --follow 621a4334f97b , wodurch ich das STDOUT sehen und gleichzeitig Strg + C davon entfernen kann, ohne den Containerbetrieb zu beeinträchtigen! Genau das, was ich immer wollte.

... natürlich müssen Sie Ihre eigene Container-ID ersetzen.

Ursprüngliche Antwort

Ich wollte den Container laufen lassen, hatte ihn aber angebracht, ohne den Container damit zu starten -it. Meine Lösung bestand darin, stattdessen meine SSH-Verbindung zu opfern (da ich in den Computer eingebunden war, auf dem die Container ausgeführt wurden). Das Beenden dieser SSH-Sitzung ließ den Container intakt, löste mich aber von ihm.

CenterOrbit
quelle