Modo corretto per staccare da un contenitore senza fermarlo


313

In Docker 1.1.2 (più recente), qual è il modo corretto di staccare da un contenitore senza fermarlo?

Quindi, ad esempio, se provo:

  • docker run -i -t foo /bin/bash o
  • docker attach foo (per il contenitore già in esecuzione)

entrambi mi portano a un terminale nel contenitore, come posso uscire dal terminale del contenitore senza fermarlo?

exited CTR+Centrambi fermano il contenitore.


Il "contenitore" è solo un insieme di spazi dei nomi limitati (uno spazio dei nomi di processo, uno spazio dei nomi del filesystem, ecc.) In cui i processi possono essere eseguiti. Se non si dispone di alcun processo all'interno di uno spazio dei nomi, tale spazio dei nomi esiste davvero? Non è come una macchina virtuale in cui c'è un kernel che risponde agli interrupt di clock ecc. indipendentemente.
Charles Duffy,

Risposte:


166

Aggiornamento: come indicato nelle risposte seguenti Ctrl+ p, Ctrl+ qora trasformerà la modalità interattiva in modalità demone.


Bene Ctrl+ C(o Ctrl+ \) dovrebbe staccarti dal contenitore ma ucciderà il contenitore perché il tuo processo principale è un bash.

Una piccola lezione sulla finestra mobile. Il contenitore non è un vero sistema operativo completo. Quando si esegue un contenitore, il processo che si avvia prende il PID 1 e assume la potenza di init. Pertanto, al termine di tale processo, il daemon arresta il contenitore fino all'avvio di un nuovo processo (tramite l'avvio docker) (Altre spiegazioni sull'argomento http://phusion.github.io/baseimage-docker/#intro )

Se vuoi un contenitore che funzioni sempre in modalità staccata, ti suggerisco di usarlo

docker run -d foo

Con un server SSH sul contenitore. (Il modo più semplice è seguire il tutorial sulla dockerizzazione di openssh https://docs.docker.com/engine/examples/running_ssh_service/ )

Oppure puoi semplicemente riavviare il tuo contenitore tramite

docker start foo

(verrà rimosso per impostazione predefinita)


3
+1 per baseimage-docker. È bello sapere che esiste un modello con consigli sulle parti difficili di Docker.
mtmacdonald,


1
eseguire una modalità contenuta in -d è stato molto utile. Inoltre, il link per avviare ssh tramite Dockerfile mi ha semplificato la vita.
Ravi,

56
Staccare usando Ctrl-p, Ctrl-q. Il consiglio di questa risposta ucciderà un container.
Taranaki,

4
Questo ha funzionato per me (preso dalla risposta di seguito): Inizia con -ti -d, quindi attacca con docker attach, quindi stacca con prima ctrl + p e poi ctrl + q. Ho pensato, potrei usare solo una delle scorciatoie da tastiera.
CGFoX,

526

Digita Ctrl+ pquindi Ctrl+ q. Ti aiuterà a trasformare la modalità interattiva in modalità demone.

Vedi 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
Sembra non funzionare con (cercando di uscire da un contenitore Wekan collegato).
danger89,

7
Ho visitato questa pagina così volte perché non riuscivo a ricordare con precisione questa combinazione di tasti! :-D
Thamme Gowda

10
@ danger89 ctrl-p, ctrl-q funzionerà solo quando hai avviato il tuo contenitore con modalità interattiva (-it). Se l'hai avviato in modalità Deamon (-d) e collegato ad esso, puoi semplicemente uscire e funzionerà comunque in background.
Riscie,

1
@SlimShady premi Ctrl + P quindi, Ctrl + Q per uscire, non uno di loro ma, entrambi nell'ordine.
Mohyaddin Alaoddin

160

Ho scavato in questo e tutte le risposte sopra sono parzialmente giuste. Tutto dipende da come viene avviato il contenitore. Si tratta di quanto segue all'avvio del contenitore:

  • era un TTY assegnato ( -t)
  • era stdin lasciato aperto ( -i)

^P^Q funziona, MA solo quando -te -iviene utilizzato per avviare il contenitore:

[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 funziona, MA solo quando -t( senza -i ) viene utilizzato per avviare il contenitore:

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

Il terzo modo di staccare

C'è un modo per staccarsi senza uccidere il contenitore però; hai bisogno di un altro guscio. In breve, eseguendo questo in un'altra shell staccato e lasciato in esecuzione il contenitore 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]$

Perché? Perché stai uccidendo il processo che ti ha connesso al contenitore, non al contenitore stesso.


2
la terza via funziona per me. Grazie. se ti stai collegando a più istanze e vuoi staccare solo da una. Può uccidere il processo specifico: ps -ef | grep attach -> get pid. Quindi: uccidi -9 <pid>
phanhuy152 il

pkill è l'unica cosa che ha funzionato per me dopo il
docker

Perché abbiamo bisogno del -9. Ho notato che se non usiamo il -9 si spegne il contenitore.
Angelo,

Altri segnali sono quelli, segnali. Dicono al processo che tipo di segnale e gli danno la possibilità di agire e fare qualcosa. Il kill -9segnale no. Il processo è terminato e non ha ricorso. La mia ipotesi è che altri segnali diano al container la possibilità di spegnersi, mentre -9non lo è.
berto

1
Questo è stato super utile. Grazie!
Evan Zamir,

40

Se fai "docker attach" id contenitore "entri nel contenitore. Per uscire dal contenitore senza arrestare il contenitore devi inserire Ctrl+ P+Q


6
meglio su Ctrl + P e Ctrl + Q
sib10

4
Ctrl + P, Q (tenendo ancora premuto Ctrl);)
dimpiax

mi restituisce:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Webwoman

31

Considero la risposta di Ashwin la più corretta, la mia vecchia risposta è sotto.


Vorrei aggiungere un'altra opzione qui che è di eseguire il contenitore come segue

docker run -dti foo bash

È quindi possibile inserire il contenitore ed eseguire bash con

docker exec -ti ID_of_foo bash

Non è necessario installare sshd :)


Penso che nel secondo comando sia necessario sostituire foo con l'id contenitore di foo
Nehal J Wani,

In questo contesto, penso che docker attachsarebbe più standard, ricollegandosi alla prima corsa bash. docker execfunziona anche qui, tuttavia crea un nuovo processo bash in aggiunta al primo. Certo, il processo viene creato nello stesso contesto / ambiente / contenitore del primo, tuttavia è diverso (un'analogia sarebbe quella di aprire una nuova scheda terminale nell'emulatore di terminale preferito).
thiagowfx,

20

Il modo predefinito per staccare da un contenitore interattivo è Ctrl+ P Ctrl+ Q, ma è possibile sovrascriverlo quando si esegue un nuovo contenitore o si collega a un contenitore esistente utilizzando il flag --detach-keys .


17

Se hai effettuato il collegamento docker attach, puoi staccarlo uccidendo il processo di collegamento della finestra mobile. Il modo migliore è utilizzare il parametro sig-proxy per evitare di passare Ctrl + C al contenitore:

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

La stessa opzione è disponibile per il docker runcomando.


6
Sebbene --sig-proxy = false sia estremamente utile, non funziona con contenitori già collegati per i quali non è stato specificato. Il problema è che, dopo aver effettuato il collegamento, non sembra esserci alcun modo per staccarlo senza uccidere il processo, incluso "il processo di collegamento docker". Cp, Cq non funziona con contenitori collegati, solo quelli interattivi (come usa la domanda).
Taranaki,

1
Questa dovrebbe essere la risposta accettata, incluso il commento di @taranaki, Ctrl + P, Q non funziona perphp:7.3-apache
MKaama,

10

Se vuoi solo vedere l'output del processo in esecuzione all'interno del contenitore, puoi fare un semplice docker container logs -f <container id>.

Il -fflag fa in modo che l'output del contenitore sia followedaggiornato in tempo reale. Molto utile per il debug o il monitoraggio.


8

È possibile utilizzare l' --detach-keysopzione quando si esegue docker attachper sovrascrivere il valore predefinito CTRL+ P, CTRL+Q sequenza (che non sempre funziona).

Ad esempio, quando corri docker attach --detach-keys="ctrl-a" teste premi CTRL+A si esce dal contenitore, senza ucciderlo.

Altri esempi:

  • docker attach --detach-keys="ctrl-a,x" test- premere CTRL+Ae quindi Xper uscire
  • docker attach --detach-keys="a,b,c" test- premere A, quindi B, quindi Cper uscire

Estratto dalla documentazione ufficiale:

Se lo si desidera, è possibile configurare una sostituzione della sequenza di tasti Docker per il distacco. Ciò è utile se la sequenza predefinita di Docker è in conflitto con la sequenza di tasti utilizzata per altre applicazioni. Esistono due modi per definire la propria sequenza di chiavi di distacco, come una sostituzione per contenitore o come proprietà di configurazione dell'intera configurazione.

Per sovrascrivere la sequenza per un singolo contenitore, utilizzare il --detach-keys="<sequence>"flag con il comando docker attach. Il formato di <sequence>è una lettera [a-Z]o ctrl-combinato con uno dei seguenti:

  • az (un singolo carattere alfa minuscolo)
  • @ (a segno)
  • [(parentesi quadra sinistra)
  • \ (due barre rovesciate)
  • _ (trattino basso)
  • ^ (cursore)

Questi a, ctrl-a, Xo ctrl-\\valori sono tutti esempi di sequenze chiave validi. Per configurare una sequenza di tasti predefinita di configurazione diversa per tutti i contenitori, consultare la sezione File di configurazione .

Nota: funziona dalla versione docker 1.10+ (al momento della risposta, la versione corrente è 18.03)


0

Vecchio post ma basta uscire quindi riavviarlo ... il problema è che se sei su una macchina Windows Ctrl p o Ctrl P sono legati alla stampa ... l'uscita dal contenitore non dovrebbe danneggiare nulla

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.