Molto probabilmente l'immagine del contenitore che usi non gestisce correttamente i segnali di processo. Se stai creando l'immagine, cambiala come suggerisce la risposta di Roland Webers. Altrimenti prova a eseguirla con --init
.
docker run -it --init ....
Questo risolve Ctrl+C per me. Fonte:https://docs.docker.com/v17.09/engine/reference/run/#specify-an-init-process
Questo post propone CTRL-Z come soluzione alternativa per inviare il processo in background e quindi terminare il processo tramite il suo ID processo:Cannot kill script Python with Ctrl-C
Possibili problemi:
-
Il programma rileva ctrl-c e non fa nulla, molto improbabile.
-
Ci sono processi in background che non sono gestiti correttamente. Solo il processo principale riceve il segnale e i processi secondari si bloccano. Molto probabile cosa sta succedendo.
Soluzione proposta:
-
Controlla la documentazione dei programmi su come è correttamente avviato e arrestato. ctrl-c sembra non essere il modo corretto.
-
Avvolgi il programma con uno script bash docker-entrypoint.sh che blocca il processo del contenitore ed è in grado di catturare ctrl-c. Questo esempio bash dovrebbe aiutare:https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash
-
Dopo aver rilevato ctrl-c, invoca il metodo di arresto appropriato per ipython notebook.
Il problema è che Ctrl-C invia un segnale al processo di primo livello all'interno del contenitore, ma quel processo non reagisce necessariamente come ci si aspetterebbe. Il processo di primo livello ha ID 1 all'interno del contenitore, il che significa che non ottiene i gestori di segnali predefiniti che i processi hanno di solito. Se il processo di primo livello è una shell, può ricevere il segnale tramite il proprio gestore, ma non lo inoltra al comando che viene eseguito all'interno della shell. I dettagli sono spiegati qui. In entrambi i casi, il contenitore docker si comporta come se ignorasse semplicemente Ctrl-C.
Se stai creando le tue immagini, la soluzione è eseguire un processo init minimo, come tini o dumb-init, come processo di livello superiore all'interno del contenitore.