Der Exit-Code 1 tritt auf, wenn Rails in der Docker-Umgebung gestoppt wird

Problem

Wenn Sie versuchen, den Container mit "Docker Stop" zu stoppen, während Sie Rails (Puma) auf Docker ausführen, erhalten Sie Exit 1 (SIGHUP). Wenn Sie ECS oder Kubernetes verwenden, wird der Container möglicherweise nicht ordnungsgemäß beendet und kann unerwartete Probleme verursachen.

% 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

Ursache

Ursache ist das sogenannte "PID 1-Problem [^ 1]". PID 1 wird als Init-Prozess bezeichnet, ein spezieller Prozess, der vom Kernel beim Systemstart aufgerufen wird. Der Init-Prozess verarbeitet Signale, erzeugt untergeordnete Prozesse, löscht Zombie-Prozesse und so weiter. Dieses Mal, als ich Rails ([^ 2]) startete, wurde PID 1 verwendet, und es gab ein Problem, dass das Signal nicht richtig verarbeitet werden konnte.

#Ergebnis der Ausführung des Befehls top für den Container
  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.

Wenn Sie sich den Prozess ansehen, können Sie sehen, dass Rails mit PID 1 ausgeführt wird.

Gegenmaßnahmen

Als untergeordneter Prozess von PID 1 mithilfe von Programmen wie tini und dumm-init Es ist möglich, die Anwendung zu starten. Wenn Docker-Compose 3.7 oder höher verfügbar ist, können Sie das Problem umgehen, indem Sie den Parameter init zu docker-compose.yml ([^ 3]) hinzufügen.

#Rails startet als untergeordneter Prozess des Init-Prozesses
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

Wenn Sie den Prozess nach dem Ausführen von "Docker-Compose Down" betrachten, wird der Container bei 143 (SIGTERM) gestoppt.

% docker-compose ps
          Name                         Command                State     Ports
-----------------------------------------------------------------------------
api                 /bin/docker-entrypoint.sh  ...   Exit 143

Wenn Sie ECS verwenden

Fügen Sie der Aufgabendefinition initProcessEnabled: true ([^ 4]) hinzu. initProcessEnabled entspricht --init in docker run.

Wenn Sie Kubernetes verwenden

Sie können auch ein leichtes Init wie tini verwenden. Ab Kubernetes 1.17 können Sie das Problem jedoch mithilfe des Share Process Namespace ([^ 5]) umgehen.

Recommended Posts

Der Exit-Code 1 tritt auf, wenn Rails in der Docker-Umgebung gestoppt wird
[Rails] Lösung, wenn ein Migrationsfehler in Acts-as-Taggable-On auftritt
500 Interner Serverfehler tritt in der Rails-Produktionsumgebung auf
So leiten Sie zu http-> https um, wenn SSL in der Rails × Heroku-Umgebung aktiviert ist
Aufbau der Rails Docker-Umgebung
Migrationsfehler nach dem Zuordnen von Activerecord in der Rails5 + Docker-Umgebung (2)
Migrationsfehler nach Activerecord-Zuordnung in der Rails5 + Docker-Umgebung
SSL in der lokalen Umgebung von Docker / Rails / Puma
Wenn im Docker-Protokoll keine Ausgabe für stdout vorhanden ist
[Docker] Rails 5.2-Umgebungskonstruktion mit Docker
Ein Fehler tritt auf, wenn codedeploy-agent in Ubuntu Server 20.04 installiert ist
Installieren Sie lsb_release über die Befehlszeile, wenn lsb_release in der Docker-Umgebung fehlschlägt
Java Spring-Umgebung in vs Code
[Umgebungskonstruktion mit Docker] Rails 6 & MySQL 8
Daten sind nicht in Rails registriert.
[Rails 6] Passen Sie Bootstrap in der Rails + Bootstrap 5.0.0-Alpha-Umgebung an
Puma --Nignx ist ein Fluchtweg, wenn die Schienen in der Umgebung nicht funktionieren
[Umgebungskonstruktion] Rails + MySQL + Docker (Anfänger können es auch in 30 Minuten verwenden!)
[Schienen] Über den Fehler, dass das Bild nicht in der Produktionsumgebung angezeigt wird
[Docker] Erstellen, wenn der Quellcode auf dem Container gebunden ist
Was tun, wenn der Tomcat-Prozess bestehen bleibt, wenn Sie Tomcat in Eclipse stoppen?
[Rails] Annotate wird bei der Migration nicht ausgeführt
[Docker] Verwenden Sie Umgebungsvariablen in Nginx conf
Schienenumgebungskonstruktion mit Docker (persönliche Apokalypse)
Erstellen einer Rails 6- und PostgreSQL-Umgebung mit Docker
Verwenden Sie Docker in einer Proxy-Umgebung unter Ubuntu 20.04.1
[Docker] Entwicklung der Entwicklungsumgebung Rails6 / Ruby2.7 / MySQL8
Erstellen Sie eine Redmine-Code-Leseumgebung in Docker
Das Bild wird in der Produktionsumgebung nicht angezeigt
[Rails] Setzen Sie die Datenbank in der Produktionsumgebung zurück
So erstellen Sie eine Rails 6-Umgebung mit Docker
[Fehlerbehebung] Tritt auf, wenn versucht wird, mit Docker eine Umgebung für den Frühling zu erstellen
[Rails5.2] Unterstützung für Piktogramme von MySQL 5.7 in Docker (Zeichencode in utf8mb4 ändern)
Festlegen, wann in junit "Der Konstruktor Empty () ist nicht sichtbar" auftritt
Was ist zu tun, wenn in einer der Quellen in der Entwicklungsumgebung mit Docker × Rails × RSpec "Nicht gefunden" angezeigt wird?