Le code de sortie 1 se produit lorsque Rails est arrêté dans l'environnement Docker

problème

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

Cause

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.

Contre-mesures

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

Si vous utilisez ECS

Ajoutez initProcessEnabled: true ([^ 4]) à la définition de tâche. initProcessEnabled est équivalent à --init dans docker run.

Si vous utilisez Kubernetes

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

Le code de sortie 1 se produit lorsque Rails est arrêté dans l'environnement Docker
[Rails] Solution lorsqu'une erreur de migration se produit dans agit-as-taggable-on
Une erreur de serveur interne 500 se produit dans l'environnement de production Rails
Comment rediriger vers http-> https lorsque SSL est activé dans l'environnement Rails × Heroku
Construction de l'environnement Rails Docker
Erreur de migration après avoir associé Activerecord dans l'environnement Rails5 + Docker (2)
Erreur de migration après l'association Activerecord dans l'environnement Rails5 + Docker
SSL dans l'environnement local de Docker / Rails / puma
Lorsqu'il n'y a pas de sortie vers stdout dans le journal du docker
[Docker] Construction de l'environnement Rails 5.2 avec docker
Une erreur se produit lorsque codedeploy-agent est installé dans Ubuntu Server 20.04
Installez lsb_release à partir de la ligne de commande lorsque lsb_release échoue dans l'environnement docker
Environnement Java Spring dans vs Code
[Construction de l'environnement avec Docker] Rails 6 et MySQL 8
Les données ne sont pas enregistrées dans Rails.
[Rails 6] Personnaliser Bootstrap dans l'environnement Rails + Bootstrap 5.0.0-alpha
Puma --Nignx est une voie de sortie lorsque les rails s -e production -d ne fonctionnent pas dans l'environnement
[Construction de l'environnement] Rails + MySQL + Docker (les débutants peuvent également l'utiliser en 30 minutes!)
[Rails] À propos de l'erreur selon laquelle l'image n'est pas affichée dans l'environnement de production
[Docker] Comment créer lorsque le code source est monté en liaison sur le conteneur
Que faire si le processus Tomcat reste lorsque vous arrêtez Tomcat dans Eclipse
[Rails] Annoter n'est pas exécuté lors de la migration
[Docker] Utiliser des variables d'environnement dans Nginx conf
Construction d'environnement de rails avec Docker (apocalypse personnelle)
Construction de Rails 6 et environnement PostgreSQL avec Docker
Construire un environnement Rails 6 + MySQL avec Docker compose
Utiliser docker dans un environnement proxy sur ubuntu 20.04.1
[Docker] Construction de l'environnement de développement Rails6 / Ruby2.7 / MySQL8
Créer un environnement de lecture de code Redmine sur Docker
L'image n'est pas affichée dans l'environnement de production
[Rails] Réinitialisez la base de données dans l'environnement de production
Comment créer un environnement Rails 6 avec Docker
[Résolution d'erreur] Se produit lors de la tentative de création d'un environnement pour le printemps avec docker
[Rails5.2] Prise en charge des pictogrammes de Mysql 5.7 dans Docker (changez le code de caractère en utf8mb4)
Comment définir quand "Le constructeur Empty () n'est pas visible" se produit dans junit
Que faire lorsque «Impossible de trouver» dans l’une des sources apparaît dans l’environnement de développement avec Docker × Rails × RSpec