04/12/2022

3. Supervisor

Lu 1017 fois Licence Creative Commons

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