Très probablement, l'image de conteneur que vous utilisez ne gère pas correctement les signaux de processus. Si vous créez l'image, modifiez-la comme le suggère la réponse de Roland Webers. Sinon, essayez de l'exécuter avec --init
.
docker run -it --init ....
Cela corrige Ctrl+C pour moi. Source :https://docs.docker.com/v17.09/engine/reference/run/#specify-an-init-process
Ce message propose CTRL-Z comme solution de contournement pour envoyer le processus en arrière-plan, puis tuer le processus par son identifiant de processus :Impossible de tuer le script Python avec Ctrl-C
Problèmes possibles :
-
Le programme attrape ctrl-c et ne fait rien, très peu probable.
-
Certains processus d'arrière-plan ne sont pas gérés correctement. Seul le processus principal reçoit le signal et les sous-processus se bloquent. Très probablement ce qui se passe.
Solution proposée :
-
Consultez la documentation du programme pour savoir comment il est correctement démarré et arrêté. ctrl-c ne semble pas être la bonne méthode.
-
Enveloppez le programme avec un script bash docker-entrypoint.sh qui bloque le processus de conteneur et est capable d'attraper ctrl-c. Cet exemple bash devrait vous aider :https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash
-
Après avoir attrapé ctrl-c, appelez la méthode d'arrêt appropriée pour le bloc-notes ipython.
Le problème est que Ctrl-C envoie un signal au processus de niveau supérieur à l'intérieur du conteneur, mais ce processus ne réagit pas nécessairement comme prévu. Le processus de niveau supérieur a l'ID 1 à l'intérieur du conteneur, ce qui signifie qu'il n'obtient pas les gestionnaires de signaux par défaut que les processus ont habituellement. Si le processus de niveau supérieur est un shell, il peut recevoir le signal via son propre gestionnaire, mais ne le transmet pas à la commande exécutée dans le shell. Les détails sont expliqués ici. Dans les deux cas, le conteneur docker agit comme s'il ignorait simplement Ctrl-C.
Si vous créez vos propres images, la solution consiste à exécuter un processus d'initialisation minimal, tel que tini ou dumb-init, en tant que processus de niveau supérieur à l'intérieur du conteneur.