捕获 docker stop 信号
为了优化代码部署效率,将传统的手动部署方式改成了容器化部署方式
过去的程序停止逻辑
- 程序持续监听 SIGINT 信号
- 使用
Ctrl + C
快捷键向程序发送 SIGINT 信号 - 程序收到 SIGINT 信号后执行退出前的收尾工作
- 收尾工作执行完成后,程序自动退出
容器化后产生的问题
使用容器化部署方式后,期望通过 docker stop
命令来执行程序退出逻辑并关闭程序和容器,结果发现程序和容器被强制关闭,而程序退出前的收尾工作并未执行。
问题产生的原因
上网搜索后得知 docker stop
命令发送的并非 SIGINT 信号,而是 SIGTERM 信号。
而程序代码中并未捕获 SIGTERM 信号,所以收到 SIGTERM 信号后,程序跳过了收尾工作,直接退出了。
修复代码后的程序停止逻辑
- 程序持续监听 SIGINT 和 SIGTERM 信号
- 使用
docker stop
命令向程序发送 SIGTERM 信号 - 收到 SIGTERM 信号后执行退出前的收尾工作
- 收尾工作执行完成后,程序自动退出
修复代码后,使用 docker stop
命令能够按照预期正确退出程序。