我有一個運行 UWSGI 服務器的 Docker 容器,該服務器使用 Flask 為 Python 中構建的 API 提供服務,該 API 具有在ENTRYPOINT ["./startapi.sh"]構建容器時啟動服務器的命令。容器使用 nginx 作為反向代理來處理請求并將它們提供給 UWSGI 實體內部的 API。
startapi.sh包含以下內容:
#!/bin/bash
service nginx start
exec uwsgi --ini uwsgi.ini &
while :; do nginx -s reload; sleep 6h; done
但是,當我嘗試docker stop使用容器時,它會等待整整 10 秒,然后再將 SIGKILL 發送到容器,因為容器內的 PID 1 是/bin/bash ./startapi.sh. 我知道為什么——因為docker stop發送的 SIGTERM 沒有到達 UWSGI 實體,因為它不是 PID 1。
我知道如何解決這個問題——只需&從exec uwsgiin的末尾洗掉——startapi.sh但是 while 回圈不會運行,因為它遵循exec uwsgi命令(至少,當我docker exec -it container.name ps auxww從主機運行時我看不到回圈) . 交換兩行(將while回圈放在 之前exec uwsgi)將正確運行 sleep 命令以重新加載 nginx,但將無法運行exec uwsgi,因此不會啟動 API。
因此,我的困境是——我希望容器中的 PID 1uwsgi --ini uwsgi.ini能夠docker stop優雅地停止 UWSGI 服務器(是的,我的每個 UWSGI GitHub 問題中確實有hook-master-start = unix_signal:15 gracefully_kill_them_all,uwsgi.ini所以它應該符合docker stopSIGTERM),但我還希望能夠通過 while 回圈/單線每 6 小時自動重新加載 nginx sleep。
我可以做些什么來實作這一目標嗎?
uj5u.com熱心網友回復:
所以交換它們。字面上地。在后臺運行回圈。
#!/bin/bash
service nginx start
while :; do nginx -s reload; sleep 6h; done &
exec uwsgi --ini uwsgi.ini
但實際上,你應該跑步supervisord。
此外,請考慮inotifywait并nginx -s reload在配置更改時執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/490078.html
