Supervisor & Docker: How to exit Supervisor if a s

2019-04-10 09:52发布

问题:

I'm currently using Supervisor inside my Docker images to start and manage my services and I would like to configure Supervisor to exit if at least one of these services entered FATAL state.

Doing that, I want to avoid to have Docker containers in running state when nothing except Supervisor has succeeded to start.

Thanks!

回答1:

You can do this with a Supervisor event listener. Subscribe it to the event PROCESS_STATE_FATAL, and respond to the event by sending a SIGTERM to supervisord, which you are presumably running as PID 1 within the container.



回答2:

As mhsmith mentioned, an event listener is the best way to achieve this. You could use the following listener (ADD this as e.g. /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()

And then, register it with supervisor:

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