Si vous essayez d'arrêter le conteneur avec docker stop
tout en exécutant Rails (Puma) sur Docker, vous obtiendrez la sortie 1 (SIGHUP).
Si vous utilisez ECS ou Kubernetes, le conteneur peut ne pas se terminer correctement et provoquer des problèmes inattendus.
% docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
xxx rails "bundle exec rails s…" 44 seconds ago Exited (1) 3 seconds ago api
xxx
La cause est le soi-disant "problème PID 1 [^ 1]". Le PID 1 est appelé le processus init, qui est un processus spécial appelé par le noyau au démarrage du système. Le processus init gère les signaux, génère des processus enfants, supprime les processus zombies, etc. Cette fois, lorsque j'ai démarré Rails ([^ 2]), le PID 1 a été utilisé et il y avait un problème en raison du fait que le signal ne pouvait pas être géré correctement.
#Résultat de l'exécution de la commande top sur le conteneur
PID USER PR NI VIRT RES %CPU %MEM TIME+ S COMMAND
1 root 20 0 2.2m 1.5m 0.0 0.1 0:00.02 S /bin/bash /bin/docker-entrypoint.sh bundle exec rails s -b 0.0.0.
Si vous regardez le processus, vous pouvez voir que Rails fonctionne avec le PID 1.
En tant que processus enfant du PID 1 en utilisant des programmes tels que tini et dumb-init Il est possible de démarrer l'application.
Si docker-compose 3.7 ou version ultérieure est disponible, vous pouvez contourner le problème en ajoutant le paramètre init
à docker-compose.yml
([^ 3]).
#Rails démarre en tant que processus enfant du processus d'initialisation
PID USER PR NI VIRT RES %CPU %MEM TIME+ S COMMAND
1 root 20 0 1.0m 0.0m 0.0 0.0 0:00.03 S /sbin/docker-init -- /bin/docker-entrypoint.sh bundle exec rails s -b 0.0.0.0
6 root 20 0 2.2m 1.5m 0.0 0.1 0:00.00 S `- /bin/bash /bin/docker-entrypoint.sh bundle exec rails s -b 0.0.0.0
En regardant le processus après avoir exécuté docker-compose down
, le conteneur est arrêté à 143 (SIGTERM).
% docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------
api /bin/docker-entrypoint.sh ... Exit 143
Ajoutez initProcessEnabled: true
([^ 4]) à la définition de tâche. initProcessEnabled
est équivalent à --init
dans docker run
.
Il existe un moyen d'utiliser un init léger tel que tini, mais à partir de Kubernetes 1.17, il semble que vous puissiez contourner le problème en utilisant Share Process Namespace ([^ 5]).
Recommended Posts