Conteneurs multi-processus
Recommandations
Par nature, un conteneur possède un point d'entrée (l'entrypoint) et doit donc avoir une tâche unique. Si ce processus est arrêté, le conteneur l'est donc également. Il est recommandé de séparer les différents processus en plusieurs conteneurs.
Tout cela peut s'avérer difficile quand:
- les processus ont besoin d'une coordination entre eux (directement liés)
- les processus sont nombreux et partagent des fichiers communs (les volumes ne sont pas mis à jour durant un déploiement)
- l'arrêt d'un processus est considéré comme "normal" et que cela ne doit pas arrêter le conteneur (exemple: les workers avec Symfony Messenger)
Solutions
Parmis les solutions recommandées par Docker se trouvent des "wrappers" Bash, comprennant:
- 1 script par processus à exécuter
- 1 script "wrapper" qui les exécute tous et surveille leur état
L'autre solution, considérée plus "lourde" est Supervisor.
Supervisor
Supervisor est un outil permettant la gestion de processus dans le cadre d'une application. Il est facilement installable par paquet:
apk add supervisor
Utiliser Supervisor
Supervisor n'a besoin que d'un fichier de configuration supervisord.conf
qui peut se trouver à plusieurs emplacements ou spécifié par l'option -c
.
Il deviendra le point d'entrée du conteneur:
...
CMD ["supervisord", "-c", "/etc/supervisord.conf"]
Configurer Supervisor
Dans le supervisord.conf
, inscrire une section spécifique pour supervisord et un paramètre nodaemon
afin qu'il s'exécute en premier plan et non pas en tâche de fond:
[supervisord]
nodaemon=true
Ajouter des programmes
Pour chaque processus que Supervisor doit gérer, ajouter une section avec l'en-tête [program:nom-du-programme]
. Comme pour la section [supervisord]
, on peut y ajouter des paramètres dont au minimum command
qui indique la commande du processus à garder actif:
...
[program:apache]
command=apache2ctl -DFOREGROUND