diff --git a/doc/guide_bonnes_pratiques.md b/doc/guide_bonnes_pratiques.md index 97675d95a1754f511a1ad24b6cad7f851470eb83..9a0b1f12f79877ce520ad5a923d61a3d54884809 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 3f4129de4839c12f7a4708a65b1caa6347ec6913..81c97073f9115e58056884fe602861e79452363d 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