[英]Stop firebase emulators gracefully when docker stop
我的 Dockerfile 安裝了 firebase 仿真器。 停止 firebase 仿真器時,應在退出前導出數據。
# Skip installation: https://firebase.google.com/docs/emulator-suite/install_and_configure
CMD ["firebase", "emulators:start", "--import=./data", "--export-on-exit"]
如果我運行docker run -ti --name my-firebase-tools my-firebase-tools
然后按 Crtl-C,firebase 模擬器會在容器停止之前優雅地停止。 一切都好。
但通常,我想運行docker run -d -ti --name my-firebase-tools my-firebase-tools
,所以容器將在后台運行。
在這種情況下,如果我運行docker stop my-firebase-tools
,沒有信號發送到 firebase 到終端 firebase 仿真器,因此沒有數據被導出。 容器在 10 秒后停止,退出代碼為 137 。
docker run -d -ti --stop-signal SIGINT --name my-firebase-tools my-firebase-tools
沒有幫助。
嘗試使用下面的 entrypoint.sh:
pid=0
sigterm_handler() {
if [ $pid -ne 0 ]; then
kill -SIGTERM "$pid"
wait "$pid"
fi
exit 143; # 128 + 15 -- SIGTERM
}
trap 'kill ${!}; sigterm_handler' SIGTERM
firebase emulators:start --import=./data --export-on-exit &
pid="$!"
# wait forever
while true
do
tail -f /dev/null & wait ${!}
done
信號被捕獲,sigterm_handler 被調用,但 firebase 仍然沒有收到終止信號。
這個入口點解決了這個問題。
#!/bin/bash
loopPid=0
pid=0
sigterm_handler() {
pkill -P "$pid"
wait "$pid"
echo "sigterm handled gracefully"
exit 0;
}
trap 'sigterm_handler' SIGTERM
sigint_handler() {
wait "$pid"
wait "$loopPid"
echo "sigint handled gracefully"
exit 0;
}
trap 'sigint_handler' SIGINT
exec firebase emulators:start --import=./data --export-on-exit &
pid="$!"
# wait forever
tail -f /dev/null &
loopPid="$!"
wait "$loopPid"
echo "Not a gracefully shutdown"
exit 1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.