簡體   English   中英

當 docker 停止時,優雅地停止 firebase 仿真器

[英]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.

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