كيفية إعادة تشغيل خدمة nginx الخاصة بـ Discourse داخل حاوية Docker؟

ما هي الطريقة الصحيحة لإعادة تشغيل nginx داخل حاوية Discourse Docker؟

يبدو أن حاوية Docker تعمل بنظام Debian 10، لكن الطريقة المعتادة لإعادة التشغيل باستخدام systemd تفشل

[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
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
root@osestaging1-discourse-ose:/var/www/discourse# 

يبدو أن هناك سكريبت init.d، لكن تشغيله يفشل. تشير السجلات إلى أن السبب هو عدم القدرة على ربط عنوان محجوز بالفعل.

root@osestaging1-discourse-ose:/etc/nginx/conf.d# /etc/init.d/nginx restart
[FAIL] Restarting nginx: nginx failed!
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)

في الواقع، nginx قيد التشغيل بالفعل

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# 

ما هي الطريقة الصحيحة لقتل عملية nginx أعلاه وإعادة تشغيلها؟

الطريقة الصحيحة لإعادة تشغيل nginx داخل حاوية Docker الخاصة بـ Discourse هي استخدام أمر sv، وهو جزء من مُشرف الخدمة 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# 

إذًا يبدو أن Ruby on Rails يستخدم runit

لقد عثرت على أمر sv لأنه مُشار إليه في ملف templates/web.template.yml

تقريبًا… Ruby on Rails محايد بشأن ما يمكنك استخدامه. قد يكون systemd، أو pid 1 مباشرًا في Docker، أو مجموعة لا حصر لها من الأدوات الأخرى.

لقد اخترنا استخدام runit في صورة Docker الرسمية لدينا لأنه خفيف الوزن وسهل الفهم. إنه أداة تعمل ببساطة.