簡體   English   中英

通過 shell 腳本在后台運行帶有 docker 容器的 exec 時和平的“docker stop”

[英]Peaceful "docker stop" when running exec in background w/ docker container via shell script

我有一個運行 UWSGI 服務器的 Docker 容器,該服務器使用 Flask 為 Python 構建的 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 docker stop發送的 SIGTERM 沒有到達 UWSGI 實例,因為它不是 PID 1。

我知道如何解決這個問題——只需從 startapi.sh 中的exec uwsgi startapi.sh末尾刪除& ——但是 while 循環不會運行,因為它遵循exec uwsgi命令(至少,我沒有看到當我從主機運行docker exec -it container.name ps auxww時循環)。 交換兩行(將while循環放在exec uwsgi之前)將正確運行 sleep 命令以重新加載 nginx,但將無法運行exec uwsgi ,因此不會啟動 API。

因此,我的困境是——我希望容器中的 PID 1 為uwsgi --ini uwsgi.ini以便 docker docker stop優雅地停止 UWSGI 服務器(是的,我確實有hook-master-start = unix_signal:15 gracefully_kill_them_all根據UWSGI GitHub問題在我的uwsgi.ini中的hook-master-start = unix_signal:15 gracefully_kill_them_all ,因此它應該符合 docker docker stop SIGTERM),但我還希望能夠通過 while 循環/ sleep單線每 6 小時自動重新加載 nginx。

我可以做些什么來實現這一目標嗎?

所以交換它們。 字面上地。 在后台運行循環。

#!/bin/bash
service nginx start
while :; do nginx -s reload; sleep 6h; done &
exec uwsgi --ini uwsgi.ini

但實際上,您應該改為運行supervisord

此外,考慮inotifywait並在配置更改時執行nginx -s reload

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM