Arrêt propre

docker stop envoie SIGTERM au PID 1, attend le délai de grâce (10 secondes par défaut), puis envoie SIGKILL. Un arrêt propre demande que l'application reçoive le signal, et ait le temps de finir son travail.

Comment ça marche

Avec la forme exec de CMD, ou exec à la fin d'un script d'enveloppe, l'application elle-même est le PID 1 et reçoit SIGTERM. stop_grace_period dans Compose (docker stop -t) fixe combien de temps Docker attend. init: true fait de tini le PID 1 pour transmettre les signaux et ramasser les zombies, mais il ne signale que son enfant direct.

Ce qui casse

Un shell en PID 1 ignore SIGTERM : chaque arrêt dure tout le délai de grâce et finit par SIGKILL (code de sortie 137), en coupant requêtes, tâches et transactions en plein milieu. Sous tini, un shell d'enveloppe meurt aussitôt (code 143) et l'application avec lui. Un travail plus long que le délai de grâce est tué lui aussi.

Dans un Dockerfile

FROM node:20-alpine
WORKDIR /app
COPY . .
# exec: node replaces the shell and receives SIGTERM itself.
CMD ["sh", "-c", "node src/migrate.js && exec node src/worker.js"]

Regarde-le casser, puis répare-le

Écris le Dockerfile ou le fichier compose, tape les commandes docker, et regarde un serveur simulé les exécuter à travers redémarrages, mises à jour et trafic. Gratuit pour commencer.