Comment redémarrer le service nginx de Discourse à l'intérieur du conteneur Docker ?

Quelle est la bonne méthode pour redémarrer nginx à l’intérieur du conteneur Docker Discourse ?

Le conteneur Docker semble exécuter Debian 10, mais la méthode habituelle avec systemd pour redémarrer nginx échoue.

[root@osestaging1 discourse]# ./launcher enter discourse_ose
root@osestaging1-discourse-ose:/var/www/discourse# cat /etc/issue
Debian GNU/Linux 10 \n \l

root@osestaging1-discourse-ose:/var/www/discourse# systemctl restart nginx
Le système n'a pas été démarré avec systemd comme système d'initialisation (PID 1). Impossible d'opérer.
Échec de la connexion au bus : l'hôte est hors ligne
root@osestaging1-discourse-ose:/var/www/discourse# 

Il semble qu’il y ait un script init.d, mais son exécution échoue. Les journaux indiquent que cela est dû à l’impossibilité de se lier à une adresse déjà utilisée.

root@osestaging1-discourse-ose:/etc/nginx/conf.d# /etc/init.d/nginx restart
[ÉCHEC] Redémarrage de nginx : nginx a échoué !
root@osestaging1-discourse-ose:/etc/nginx/conf.d# tail /var/log/nginx/error.log
2019/11/12 10:32:45 [emerg] 1123#1123: bind() to unix:/shared/nginx.http.sock failed (98: Adresse déjà utilisée)
2019/11/12 10:32:45 [emerg] 1123#1123: bind() to unix:/shared/nginx.http.sock failed (98: Adresse déjà utilisée)
2019/11/12 10:32:45 [emerg] 1123#1123: bind() to unix:/shared/nginx.http.sock failed (98: Adresse déjà utilisée)
2019/11/12 10:32:45 [emerg] 1123#1123: bind() to unix:/shared/nginx.http.sock failed (98: Adresse déjà utilisée)
2019/11/12 10:32:45 [emerg] 1123#1123: bind() to unix:/shared/nginx.http.sock failed (98: Adresse déjà utilisée)
2019/11/12 10:32:45 [emerg] 1123#1123: impossible de se lier
2019/11/12 10:32:47 [emerg] 1127#1127: bind() to unix:/shared/nginx.http.sock failed (98: Adresse déjà utilisée)
2019/11/12 10:32:47 [emerg] 1127#1127: bind() to unix:/shared/nginx.http.sock failed (98: Adresse déjà utilisée)
2019/11/12 10:32:47 [emerg] 1127#1127: bind() to unix:/shared/nginx.http.sock failed (98: Adresse déjà utilisée)
2019/11/12 10:32:47 [emerg] 1127#1127: bind() to unix:/shared/nginx.http.sock failed (98: Adresse déjà utilisée)

En effet, nginx est déjà en cours d’exécution.

root@osestaging1-discourse-ose:/etc/nginx/conf.d# ps -ef | grep -i nginx
root        46    40  0 10:19 ?        00:00:00 runsv nginx
root      1174    46  1 10:33 ?        00:00:00 /usr/sbin/nginx
root      1177   108  0 10:33 pts/1    00:00:00 grep -i nginx
root@osestaging1-discourse-ose:/etc/nginx/conf.d# 

Quelle est la méthode appropriée pour tuer le processus nginx ci-dessus et le redémarrer ?

La méthode correcte pour redémarrer nginx à l’intérieur du conteneur Docker Discourse consiste à utiliser la commande sv, qui fait partie du superviseur de services runit.

root@osestaging1-discourse-ose:/var/www/discourse# sv stop nginx
ok: down: nginx: 1s, normally up
root@osestaging1-discourse-ose:/var/www/discourse# sv start nginx
ok: run: nginx: (pid 269) 0s
root@osestaging1-discourse-ose:/var/www/discourse# 

Il semble donc que Ruby on Rails utilise runit.

J’ai trouvé la commande sv car elle est référencée dans le fichier templates/web.template.yml.

Pas tout à fait… Ruby on Rails est agnostique quant à ce que vous utilisez. Cela pourrait être systemd, un PID 1 direct dans Docker ou une multitude d’autres outils.

Nous avons choisi d’utiliser runit dans notre image Docker officielle car il est léger et très facile à comprendre. C’est un outil qui fonctionne simplement.