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!
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.
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