微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当 docker stop

如何解决当 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 模拟器会在容器停止之前正常停止。一切正常。

enter image description here

但通常情况下,我想运行 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 举报,一经查实,本站将立刻删除。