我目前在Docker镜像中使用Supervisor来启动和管理我的服务,并希望配置Supervisor,如果其中一个服务进入FATAL状态,Supervisor会退出。
这样做,我希望避免当除了Supervisor之外没有其他东西能够成功启动时,Docker容器仍处于运行状态。
这样做,我希望避免当除了Supervisor之外没有其他东西能够成功启动时,Docker容器仍处于运行状态。
正如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 PanchenkoPROCESS_STATE_FATAL
事件,当事件发生时,向 supervisord 发送一个 SIGTERM 信号,假设您正在容器中作为 PID 1 运行 supervisord。