如何解决当 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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。