Come si collega e si stacca dal processo di Docker?


459

Posso collegarmi a un processo docker ma Ctrl+ cnon funziona per staccarlo da esso. exitsostanzialmente interrompe il processo.

Qual è il flusso di lavoro consigliato per eseguire il processo, collegarsi occasionalmente ad esso per apportare alcune modifiche e quindi staccarlo?


4
Quando uso nsenter, ho appena premuto Ctrl-D.
user2105103,

Fa chiusura xterm, konsoleecc di lavoro? Funziona per me (mi distacco).
Vytenis Bivainis,

Risposte:


668

Per staccare il tty senza uscire dalla shell, utilizzare la sequenza di escape Ctrl+ Pseguita da Ctrl+ Q. Maggiori dettagli qui .

Ulteriori informazioni da questa fonte :

  • docker run -t -i → può essere staccato ^P^Qe ricollegato con docker attach
  • docker run -i → non può essere rimosso con ^P^Q; interromperà lo stdin
  • docker run → non può essere staccato con ^P^Q; può client SIGKILL; può ricollegarsi con la finestra mobile allegata

46
Questa sarebbe un'ottima risposta se effettivamente funzionasse come descritto nei documenti.
allingeek,

20
Ho scoperto che anche quando si esegue con -it, la sequenza di distacco non riesce se si avvia anche il contenitore con il flag cleanup (--rm). Questo potrebbe essere ovvio per alcuni, ma mi morde più spesso di quanto vorrei ammettere.
allingeek,

7
Un'altra opzione è quella di chiudere semplicemente la finestra del terminale o cmd-w :)
buildmaestro

3
Puoi impostare chiavi di distacco configurabili con ad es. "detachKeys": "ctrl-a,a"Nel tuo file .docker / config.json o --detach-keys "ctrl-a,a"nella riga di comando con attach ecc.
Matthew Hannigan

4
Ctrl + Znon si stacca; fa da sfondo al processo. Non è lo stesso del distacco e comporta una penalità di prestazione.
Zenexer,

178

Controlla anche l' --sig-proxyopzione di :

docker attach --sig-proxy=false 304f5db405ec

Quindi usa CTRL+ cper staccare


4
Per provare questo a partire da run invece di attach, ho provato: docker run -ti --sig-proxy=false busybox top che sembra non funzionare, il processo viene interrotto con ctrl-c ma a partire docker run -t -sig-proxy=false busybox top sembra funzionare e consentire di uscire con ctrl-c
Henning

Ctrl-cfermerà anche il contenitore.
Evan Hu,

È l'unica soluzione tra quelle elencate qui che funziona per me sul server Debian 9 con Docker 19.03.5. La domanda è: perché non è questa l'impostazione predefinita per i comandi attach? Sembra essere il caso d'uso più comune.
fviktor,

La sequenza Ctrl-p, Ctrl-q non funziona per me (iniziata come contenitore docker allegare xyz) .. ma questo funziona. Grazie @czerasz
PravyNandas il

92

Se vuoi solo apportare qualche modifica ai file o ispezionare i processi, ecco un'altra soluzione che probabilmente desideri.

È possibile eseguire il comando seguente per eseguire un nuovo processo dal contenitore esistente:

sudo docker exec -ti [CONTAINER-ID] bash

avvierà un nuovo processo con bash shell e potresti fuggire da esso direttamente Ctrl+ C, non influirà sul processo originale.


6
Questo ha funzionato, puoi digitare "exit" una volta terminato senza influire sul processo originale.
Eko3alpha,

Questo è un ottimo modo per collegarsi a un container in esecuzione. Ma cosa succede se (diciamo) ho qualche processo in esecuzione nel contenitore e voglio riavviare quel processo? Ah, posso semplicemente uccidere il vecchio processo, riavviare quello nuovo e usare Cp, Cq, che funziona dal momento che è un tty interattivo. Mi piace anche il metodo --sig-proxy = false, ma questo è più versatile e non forza l'interruzione del processo corrente.
Taranaki,

"attach" ha un significato specifico con Docker e execnon lo è.
frnhr

48

Penso che questo dovrebbe dipendere dalla situazione. Prendi il seguente contenitore come esempio:

# 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) Utilizzare " docker attach" per fissare il contenitore:

Poiché " docker attach" non alloca un nuovo tty, ma riutilizza il tty in esecuzione originale, quindi se si esegue il exitcomando, causerà l'uscita del contenitore in esecuzione:

# 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

Quindi, a meno che tu non voglia davvero uscire dal container in esecuzione, dovresti usare Ctrl+ p+ Ctrl+ q.

(2) Usa " docker exec"

Dal momento che " docker exec" verrà allocare una nuova tty, quindi penso che si dovrebbe usare exital posto di Ctrl+ p+ Ctrl+ q.

Di seguito è in esecuzione Ctrl+ p+ Ctrl+ qper chiudere il contenitore:

# 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

Quindi accedi di nuovo al contenitore, vedrai che il bashprocesso con il docker execcomando precedente è ancora attivo (PID è 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

39

Per staccare da un contenitore in esecuzione, utilizzare ^P^Q(tenere premuto Ctrl, premere P, premere Q, rilasciare Ctrl).

C'è un problema : funziona solo se il contenitore è stato avviato con entrambi -t e -i.

Se hai un container in esecuzione che è stato avviato senza una (o entrambe) di queste opzioni e ti colleghi con docker attach, dovrai trovare un altro modo per staccare. A seconda delle opzioni scelte e del programma in esecuzione, ^Cpotrebbe funzionare o potrebbe uccidere l'intero contenitore. Dovrai sperimentare.

Un altro problema: a seconda dei programmi in uso, il terminale, la shell, il client SSH o il multiplexer potrebbero intercettare uno ^Po ^Q(di solito quest'ultimo). Per verificare se questo è il problema, prova a eseguire o allegare con l' --detach-keys zargomento. Ora dovresti essere in grado di staccarti premendo z, senza alcun modificatore. Se funziona, un altro programma sta interferendo. Il modo più semplice per aggirare questo problema è impostare la propria sequenza di distacco usando l' --detach-keysargomento. (Ad esempio, per uscire con ^K, utilizzare --detach-keys 'ctrl-k'.) In alternativa, è possibile tentare di disabilitare l'intercettazione dei tasti nel terminale o in un altro programma che interferisce. Ad esempio, stty start ''o stty start undefpotrebbe impedire l'intercettazione del terminale^Q su alcuni sistemi POSIX, anche se non l'ho trovato utile.


2
Spiegazione super precisa, ha funzionato come un incantesimo
Meir Gabay

27

quando nient'altro funziona, apri un nuovo terminale quindi:

$ 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>

Che trappola! Grazie, questa è l'unica cosa che ha funzionato. -9non era necessario.
Heath Raftery,

Questo uccide anche il contenitore - forse dipende da quali bandiere sono state impostate.
AdamAL,

1
Si noti che se sono visualizzati due pid, il primo è il genitore. Dovresti usare il secondo pid per uccidere docker attache non il suo genitore.
joeytwiddle,

11

Per staccare dal contenitore, tieni semplicemente premuto Ctrle premi P+ Q.

Per collegarlo a un container in esecuzione si utilizza:

$ docker container attach "container_name"

9

Ho avuto lo stesso problema, ctrl- Pe Qnon avrebbe funzionato, né ctrl- C... alla fine ho aperto un'altra sessione di terminale e l'ho fatto "finestra mobile fermata containerid " e "Start finestra mobile containerid " e ha ottenuto il lavoro fatto. Strano.


Questo non funzionerà se hai avviato il contenitore con --rmflag. Ctrl+Pe Ctrl+Qfunziona se hai avviato il contenitore con -itflag.
Aswath K,

4

Nella stessa shell, tieni premuto il ctrltasto e premi i tasti pquindiq


3
Funziona solo se hai avviato il contenitore con -itflag.
Aswath K,

2

Sono su un Mac, e per qualche motivo, Ctrl- p Ctrl- qfunzionerebbe solo se lo avessi tenuto anche ioShift


1
  1. Apri un nuovo terminale
  2. Trova l'ID del contenitore in esecuzione docker ps
  3. Uccidi il contenitore docker kill ${containerId}

0

per interrompere un processo docker e rilasciare le porte, utilizzare innanzitutto ctrl- cper uscire dal contenitore, quindi utilizzare docker ps per trovare l'elenco dei contenitori in esecuzione. Quindi è possibile utilizzare l'arresto del contenitore della finestra mobile per interrompere tale processo e rilasciare le sue porte. Il nome del contenitore si trova nel comando ps docker che fornisce il nome nella colonna del nome. Spero che questo risolva le tue domande ....


0

Se è necessario solo il processo docker per passare in background, è possibile utilizzare

Ctrl + Z

Essere consapevoli del fatto che non è un vero distacco e viene fornito con una penalità di prestazione. (Puoi riportarlo in primo piano con il bgcomando).

Un'altra opzione è quella di chiudere il terminale, se non è più necessario.


0

Per chiunque abbia riscontrato lo stesso problema che ho fatto (non riesco a staccarlo senza uccidere il contenitore, anche quando si imposta la chiave di scollegamento) ......

All'avvio dei contenitori con docker-compose up -d

invece di utilizzare docker attach {container name}per visualizzare il registro di coda ....

prova docker-compose logs -f {service name} ctrl: cuccide la coda senza uccidere il container

{service name}essendo il servizio elencato a lato del file docker-compose.yml .. (ad es. mentre nome contenitore = elk_logstash_1 -> nome servizio = logstash

HTH


0

Aggiornare

In genere ho usato la docker attach per vedere cosa visualizzava STDOUT, per la risoluzione dei problemi dei contenitori. Ho appena scoperto docker logs --follow 621a4334f97b, il che mi permette di vedere STDOUT pur essendo in grado di ctrl + c di esso senza influire sul funzionamento del contenitore! Esattamente quello che ho sempre desiderato.

... naturalmente dovrai sostituire il tuo ID contenitore.

Risposta originale

Volevo lasciare il container in esecuzione, ma avevo collegato senza avviare il container con -it. La mia soluzione era invece quella di sacrificare la mia connessione SSH (da quando ero SSHed nella macchina che stava eseguendo i contenitori). Uccidere quella sessione SSH ha lasciato intatto il contenitore ma mi ha staccato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.