ARTICLES
Apache et Docker
Si, comme moi, vous utilisez Apache dans un conteneur Docker en tant que process principal (comprendre : CMD [ "/sbin/httpd", "-D", "FOREGROUND" ]), il se peut que cet article vous intéresse.
Il y a peu, je me suis retrouvé avec ma “prod” (ça me fait toujours marrer d’utiliser ce mot pour mes 3 pauvres conteneurs qui tournent dans le vent) toute cassée. En l’occurrence, mes conteneurs Docker étaient en mode “restart en boucle”.
Diantre, me dis-je. Mes logs me répétaient : http (pid 1) already running. Non, je crois pas. Vous êtes même pas started, je vois pas comment vous pouvez être “already running”.
Puis je me suis rendu compte que dans ces conteneurs, j’avais un fichier de lock Apache qui existait avec dedans l’entier (le PID) “1”. Et le problème devint évident :
- Mon conteneur avec Apache tournait tranquilou
- Il s’est fait kill à la mode barbare (au hasard, ma VM qui reboote tout seule)
- Il tente de se relancer : Apache démarre, voit le fichier de lock, voit le PID 1, vérifie si le process associé tourne toujours
- Le process avec le PID 1 tourne toujours (c’est Apache en train de démarrer)
- Apache se dit “houlà, le process tourne déjà, je vais pas me relancer une seconde fois” (il est con Apache)
- Apache me dit
http (pid 1) already running - Docker voit que le conteneur s’arrête, il relance (ça c’est moi qui le lui demande)
- Et ça repart pour un tour
Du coup la solution est toute bête : il faut qu’Apache se rende compte que le PID 1 qui tourne quand il se lance, ben c’est lui-même et que donc, il peut continuer à se lancer. J’ai donc fait un rapport de bug avec patch (oui je patche Apache moi, je suis un ouf).
Mise à jour : mon patch a été accepté. Je suis donc officiellement contributeur Apache. Propre.
Et en attendant que le patch se fasse merger, j’ai résolu le problème tout bêtement avec l’astuce suivante :
1CMD rm -rf /var/run/httpd/httpd.pid && /sbin/httpd -D FOREGROUND