Cómo reiniciar el servicio nginx de Discourse dentro del contenedor Docker

¿Cuál es la forma correcta de reiniciar nginx dentro del contenedor Docker de Discourse?

El contenedor Docker parece estar ejecutando Debian 10, pero el método habitual de systemd para reiniciar nginx falla

[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
El sistema no se ha iniciado con systemd como sistema init (PID 1). No se puede operar.
Error al conectarse al bus: El host está caído
root@osestaging1-discourse-ose:/var/www/discourse# 

Parece que hay un script init.d, pero ejecutarlo falla. Los registros indican que es porque no puede vincularse a una dirección ya en uso.

root@osestaging1-discourse-ose:/etc/nginx/conf.d# /etc/init.d/nginx restart
[FAIL] Reiniciando nginx: ¡nginx falló!
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: Address already in use)
2019/11/12 10:32:45 [emerg] 1123#1123: bind() to unix:/shared/nginx.http.sock failed (98: Address already in use)
2019/11/12 10:32:45 [emerg] 1123#1123: bind() to unix:/shared/nginx.http.sock failed (98: Address already in use)
2019/11/12 10:32:45 [emerg] 1123#1123: bind() to unix:/shared/nginx.http.sock failed (98: Address already in use)
2019/11/12 10:32:45 [emerg] 1123#1123: bind() to unix:/shared/nginx.http.sock failed (98: Address already in use)
2019/11/12 10:32:45 [emerg] 1123#1123: still could not bind()
2019/11/12 10:32:47 [emerg] 1127#1127: bind() to unix:/shared/nginx.http.sock failed (98: Address already in use)
2019/11/12 10:32:47 [emerg] 1127#1127: bind() to unix:/shared/nginx.http.sock failed (98: Address already in use)
2019/11/12 10:32:47 [emerg] 1127#1127: bind() to unix:/shared/nginx.http.sock failed (98: Address already in use)
2019/11/12 10:32:47 [emerg] 1127#1127: bind() to unix:/shared/nginx.http.sock failed (98: Address already in use)

Efectivamente, nginx ya está en ejecución

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# 

¿Cuál es la forma adecuada de matar el proceso de nginx anterior y volver a iniciarlo?

La forma correcta de reiniciar nginx dentro del contenedor Docker de Discourse es usar el comando sv, que forma parte del supervisor de servicios 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# 

Parece que Ruby on Rails utiliza runit

Encontré el comando sv ya que se hace referencia a él en el archivo templates/web.template.yml

Casi… Ruby on Rails es agnóstico respecto a lo que se utilice. Podría ser systemd, un pid 1 directo en Docker o una multitud de otras herramientas.

Optamos por usar runit en nuestra imagen oficial de Docker porque es ligero y muy fácil de entender. Es una herramienta que simplemente funciona.