2017-04-19 2 views
0

Nous avons un conteneur Docker qui exécute systemd comme processus principal (PID 1). Nous avons également commencé nos processus de travail dans le conteneur Docker via l'unité systemd. Nos conteneurs Docker utilisent CentOS 7.2. Nous avons configuré le Docker stop timeout afin que nous puissions gérer l'arrêt gracieux des processus de travail s'exécutant à l'intérieur du conteneur Docker. Lorsque nous arrêtons le conteneur Docker, nous pouvons voir que SIGTERM est reçu par le processus systemd qui s'exécute avec PID 1 dans le conteneur. Le conteneur attend également le timeout d'arrêt que nous avons configuré. Mais le processus systemd ne transmet pas ce SIGTERM à nos processus de travail que nous avons commencé à utiliser l'unité systemd. À partir des journaux, il semble que lorsque systemd reçoit SIGTERM, il essaie de se réexécuter. Nous avons essayé d'ajouter KillMode = mélangé dans notre fichier d'unité systemd mais cela n'a pas fonctionné pour nous.Pourquoi le processus systemd s'exécute-t-il dans le conteneur docker avec PID 1 ne pas transférer SIGTERM aux processus enfants sur l'arrêt du docker

Existe-t-il un moyen de transférer SIGTERM du processus systemd vers les processus enfants?

+0

peut être une lecture utile: https://engineeringblog.yelp.com/2016/01/dumb-init-an-init-for-docker.html –

+0

De l'article partagé, il ressemble à init système standard (systemd dans notre case) devrait être capable de transférer SIGTERM vers des processus enfants mais cela ne se produit pas exactement dans notre cas. Nous voulons utiliser systemd pour notre installation. Vous cherchez un moyen de transmettre les signaux de systemd aux processus fils. – Sachin

Répondre

-1

Collez votre commande d'exécution de docker, s'il vous plaît.

Je suppose que vous devez ajouter ces 2 options.

--stop-signal=SIGRTMIN+3 --env container=docker 
0

Au lieu d'exécuter systemd lui-même, vous pouvez également essayer un remplacement offrant une fonctionnalité similaire. Si vous placez le docker-systemctl-replacement comme point d'entrée du conteneur, alors il recherchera les fichiers d'unité systemd que vous avez fournis - au démarrage du conteneur, il exécutera ExecStart à partir des descripteurs d'unités et SIGSTOP exécutera ExecStop à partir de chacun des descripteurs d'unité. On dirait que c'est la fonctionnalité que vous voulez de toute façon.