Si je me connecte à un conteneur Docker
$> docker exec -it my_container zsh
et à l'intérieur, je veux tuer quelque chose que j'ai commencé avec ctrl+c
J'ai remarqué que cela prend une éternité à compléter. J'ai cherché sur Google et il semble que ctrl+c
fonctionne un peu différemment de ce à quoi vous vous attendiez. Ma question, comment puis-je réparer ctrl+c
à l'intérieur d'un conteneur?
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 ne reçoit pas les gestionnaires de signaux par défaut que les processus ont généralement. Si le processus de niveau supérieur est un shell, il peut alors recevoir le signal via son propre gestionnaire, mais ne le transfère pas à la commande exécutée dans le shell. Les détails sont expliqués ici . Dans les deux cas, le conteneur de menu fixe agit comme s'il ignorait simplement Ctrl-C.
À partir de docker 0.6.5
, vous pouvez ajouter -t
à la commande d'exécution du menu fixe, qui joindra un pseudo-TTY
. Ensuite, vous pouvez taper Control-C
pour le détacher du conteneur sans le terminer.
Si vous utilisez -t
et -i
, Control-C mettra fin au conteneur. Lorsque vous utilisez -i with -t
, vous devez utiliser Control-P Control-Q
pour le détacher sans terminer.
Test 1:
$ ID=$(Sudo docker run -t -d ubuntu /usr/bin/top -b)
$ Sudo docker attach $ID
Control-C
$ Sudo docker ps
Le conteneur est toujours répertorié.
Test 2:
$ ID=$(Sudo docker run -t -i -d ubuntu /usr/bin/top -b)
$ Sudo docker attach $ID
Control-C
$ Sudo docker ps
le conteneur n'est pas là (il a été terminé). Si vous tapez Control-P
Control-Q
à la place de Control-C dans le deuxième exemple, le conteneur serait toujours en cours d'exécution.
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 aider: https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash
Utilisation Ctrl+\ au lieu de Ctrl+C
Il tue le processus au lieu de lui demander poliment de s’arrêter. (en savoir plus ici .)