Como reiniciar o serviço nginx do Discourse dentro do container Docker?

Qual é a maneira correta de reiniciar o nginx dentro do contêiner Docker do Discourse?

O contêiner Docker parece estar executando o Debian 10, mas a abordagem usual do systemd para reiniciar o nginx falha

[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
O sistema não foi iniciado com o systemd como sistema init (PID 1). Não é possível operar.
Falha ao conectar ao bus: Host inativo
root@osestaging1-discourse-ose:/var/www/discourse# 

Parece que há um script init.d, mas executá-lo falha. Os logs indicam que o motivo é a impossibilidade de vincular a um endereço já em uso.

root@osestaging1-discourse-ose:/etc/nginx/conf.d# /etc/init.d/nginx restart
[FAIL] Reiniciando nginx: nginx falhou!
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: ainda não foi possível vincular()
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)

De fato, o nginx já está em execução

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# 

Qual é a maneira correta de encerrar o processo nginx acima e iniciá-lo novamente?

A maneira correta de reiniciar o nginx dentro do container Docker do Discourse é usar o comando sv, que faz parte do supervisor de serviços 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# 

Portanto, parece que o Ruby on Rails utiliza o runit.

Encontrei o comando sv pois ele é referenciado no arquivo templates/web.template.yml

Quase… O Ruby on Rails é agnóstico quanto ao que você usaria. Poderia ser o systemd, o pid 1 direto no Docker ou uma infinidade de outras ferramentas.

Optamos por usar o runit na nossa imagem oficial do Docker porque ele é leve e muito fácil de entender. É uma ferramenta que simplesmente funciona.