DG devGiants tech notes

15 février 2018

Docker Apache impossible à relancer : httpd already running

Comment corriger cette erreur avec mes stacks Docker.

Contexte

Dans les stacks Docker que j’ai créées (ici et ici), j’ai fini par constater après quelques usages que je pouvais rencontrer un problème au redémarrage de la stack. Apache ne démarre pas avec le message suivant : httpd (pid: XX) already running.

Explication

J’utilise généralement docker-compose stop pour arrêter mes stacks entre deux projets. C’est différent de docker-compose down parce que cela ne détruit pas les containers, mais les arrête seulement. Dans un monde idéal, il n’y aurait aucun souci, et en plus c’est un peu plus rapide.

En revanche, si la stack s’arrête à cause d’un crash, les containers peuvent devenir totalement inutilisables. À cause de l’architecture interne d’Apache, un nouveau démarrage va trouver le fichier /var/run/apache2/apache2.pid et le système du container ne lancera pas Apache afin d’éviter (du moins c’est ce qu’il comprend) une seconde instance déjà active.

Solution

Il y a deux points ici :

  1. Utiliser docker-compose down plutôt que docker-compose stop. D’un point de vue Docker, c’est la bonne pratique, parce que chaque container sera recréé from scratch à chaque fois que vous en aurez besoin. Comme vous avez persisté ce qu’il faut dans des volumes, vous ne perdez rien.
  2. Personnaliser votre image Apache pour supprimer ce fichier de lock quand le container est recréé.