web-dev-qa-db-fra.com

Comment réparer ctrl + c à l'intérieur d'un conteneur de menu fixe

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?

9
Jeanluca Scaljeri

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

13
NID

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 .)

2
asedsami