From 89a357f1bf3b9934b7a8888d6089c2b3d7d5f029 Mon Sep 17 00:00:00 2001
From: Quentin Duchemin <quentinduchemin@tuta.io>
Date: Mon, 15 Jun 2020 22:43:51 +0200
Subject: [PATCH] [Doc] Add good practice about init system

---
 doc/guide_bonnes_pratiques.md | 18 ++++++++++++++++++
 template/docker-compose.yml   |  5 +++++
 2 files changed, 23 insertions(+)

diff --git a/doc/guide_bonnes_pratiques.md b/doc/guide_bonnes_pratiques.md
index 97675d95..9a0b1f12 100644
--- a/doc/guide_bonnes_pratiques.md
+++ b/doc/guide_bonnes_pratiques.md
@@ -124,6 +124,24 @@ services:
       - docker_default
 ```
 
+## Système init
+
+Tous les systèmes Linux ont un système dit `init`, correspondant au processus avec le premier PID (1). Ce processus est le parent de tous les autres, et doit transmettre les signaux qu'il reçoit à ses enfants (par exemple, un signal de terminaison).
+
+Quand vous lancez un conteneur avec un script Shell ou Bash comme entrypoint, ce script a le PID 1.
+S'il démarre ensuite l'application, il ne transmettra pas le signal de terminaison à ses enfants.
+
+Le souci, c'est qu'un `docker stop` enverra un signal `SIGTERM` au script d'entrypoint, mais il ne sera pas transmis au service en lui-même, qui se terminera brutalement par un `SIGKILL` après expiration du timeout.
+
+Docker Compose, depuis la version 3.7, adresse ce problème avec une directive très simple :
+```
+services:
+  exemple:
+    init: true
+```
+
+[Plus d'informations sur ce lien](https://hynek.me/articles/docker-signals/) et [sur la documentation de Compose](https://docs.docker.com/compose/compose-file/#init)
+
 ## Réseaux
 
 L'idée est de mettre dans des réseaux séparés les services n'ayant pas besoin de communiquer entre eux, pour améliorer la sécurité de l'infrastructure.
diff --git a/template/docker-compose.yml b/template/docker-compose.yml
index 3f4129de..81c97073 100644
--- a/template/docker-compose.yml
+++ b/template/docker-compose.yml
@@ -36,6 +36,11 @@ services:
     # Use a comprehensive name for easy
     # understanding of `docker ps` output
     container_name: app
+    # Add a init-like process in the container to
+    # forward signals to the child process.
+    # Use this line if you are using an Bash script
+    # entrypoint, for exemple.
+    init: true
     # If the container has to be reached from
     # the Internet, put in docker_default
     # Otherwise, just in its own network
-- 
GitLab