Supervisor和Docker:如果服务无法启动,如何退出Supervisor?

5
我目前在Docker镜像中使用Supervisor来启动和管理我的服务,并希望配置Supervisor,如果其中一个服务进入FATAL状态,Supervisor会退出。
这样做,我希望避免当除了Supervisor之外没有其他东西能够成功启动时,Docker容器仍处于运行状态。

1
如果这是一个真正的需求,请考虑将您的服务拆分成单独的容器。您现在要求 supervisord 自杀。 - user2105103
3
我更倾向于把这看作是他变得无用(没工作可做)后的“辞职”,而不是“自杀” :-) - Brice Argenson
我认为supervisord目前无法自杀,因此无论如何,您都需要一个外部进程来监视它。可以在容器内或容器外执行此操作。最简单的方法可能是从容器外运行一个命令来检查supervisor,如果没有工作,则杀死容器。或者也可以创建一个supervisor程序:xxx部分,运行一个脚本来检查supervisor并自杀? :O - ryan1234
2个回答

9

正如mhsmith所提到的,事件监听器是实现这一目的的最佳方式。您可以使用以下监听器(将其添加为例如/usr/local/bin/exit-event-listener):

#!/usr/bin/env python
import os
import signal

from supervisor import childutils

def main():
    while True:
        headers, payload = childutils.listener.wait()
        childutils.listener.ok()
        if headers['eventname'] != 'PROCESS_STATE_FATAL':
            continue
        os.kill(os.getppid(), signal.SIGTERM)

if __name__ == "__main__":
    main()

接着,将其在supervisor中进行注册:

[eventlistener:exit_on_any_fatal]
command=exit-event-listener
events=PROCESS_STATE_FATAL

感谢您描述这种方法。但是,我无法使其工作 - exit-event-listener 返回退出代码 127(命令未找到),因此我不得不将 command=exit-event-listener 替换为 command=python exit-event-listener - Vladimir Panchenko

2
您可以使用Supervisor event listener来完成这个操作。将其订阅到PROCESS_STATE_FATAL事件,当事件发生时,向 supervisord 发送一个 SIGTERM 信号,假设您正在容器中作为 PID 1 运行 supervisord。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接