我有一个在前台运行 apache 的 docker 容器。在停止 docker 容器时,一个 SIGTERM 被发送到所有子进程,在我们的例子中是 apache。
现在,我面临的问题是在接收到 SIGTERM 信号时优雅地关闭 apache。Apache 通常会立即终止当前请求,这是问题的主要原因。不知何故,我需要将 SIGTERM 信号转换为SIGWINCH,这最终会优雅地关闭服务器。
我正在考虑编写某种包装脚本,但不知道如何开始。
在这方面的任何建议将不胜感激!
谢谢。
可以通过发出以下命令优雅地停止容器内的 tomcat(如果需要,更改 tomcat 路径):
docker exec -it <container id / name> /usr/local/apache2/bin/apachectl -k graceful
对于您的评论,如果您想查看 tomcat 日志以防它没有在前台运行
docker exec -it <container id / name> tail -f tail -f /usr/local/apache2/logs/error_log
更新:根据评论。
从docker 文档中,您可以指定停止 docker 容器的时间。默认情况下,它只会等待 10 秒。
要停止具有不同超时的容器:
docker stop -t <time in seconds> <container id/ name>
我相信,在停止时增加超时时间可能会对您的情况有所帮助。
SIGWINCH
在您的情况下, UPDATE2发送自定义信号。请参阅此处了解更多详情。
docker kill -s SIGWINCH <apache container id / name>
UPDATE3 有关于信号捕获的有用资源:
https://medium.com/@gchudnov/trapping-signals-in-docker-containers-7a57fdda7d86#.qp68kskwd
http://www.techbar.me/stopping-docker-containers-gracefully/
希望这些是有帮助的。