Korzystam z kontenera dokowanego z takim nadzorem:
Plik Docker
CMD ["/run.sh"]
run.sh
#!/usr/bin/env bash
exec supervisord -n
supervisor-serf.conf
[group:job]
programs=serf,producer
[program:serf]
command=/start-serf-agent.sh
numprocs=1
autostart=true
autorestart=unexpected
stopasgroup=true
killasgroup=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
start-serf-agent.sh
#!/bin/bash
exec serf agent --join=serf:7946 -tag role=producer
supervisor-servce.conf
[program:producer]
command=/start.sh
numprocs=1
stopasgroup=true
killasgroup=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
start.sh
#!/bin/bash
exec /producer --project=${NAME}
Po zatrzymaniu producenta mam:
producer_1 | 2016/02/29 21:59:50 [INFO] serf: EventMemberLeave: 7c4fbc80af97 172.19.0.2
producer_1 | 2016/02/29 21:59:51 INF 1 stopping
producer_1 | 2016/02/29 21:59:51 INF 1 exiting router
producer_1 | 2016-02-29 21:59:51,281 INFO exited: producer (exit status 0; expected)
producer_1 | 2016/02/29 21:59:51 [INFO] agent: Received event: member-leave
ale poddany agent utrzymuje kontener w stanie gotowości. Chcę zatrzymać kontener Docker, gdy producent poprawnie zakończy swoją pracę ze statusem 0. Próbowałem dołączyć procesy do jednej grupy, ale wygląda na to, że nie działa. Chłopaki, co pominąłem? Pomóż mi proszę!
linux
docker
process
supervisord
containers
Witalij Velikodny
źródło
źródło
Odpowiedzi:
Rozwiązałem problem z listą zdarzeń supervisora :
kill.py
Dobre zarządzanie procesami artykułów w kontenerach dokerów
źródło
Oto nieco bardziej usprawniona wersja, która wykorzystuje skrypt powłoki zamiast skryptu python, a także obejmuje wiele usług, zabijając cały organ nadzorczy, jeśli któryś z nich zawiedzie.
supervisord.conf stop-supervisor.shBibliografia
źródło
Oto proste rozwiązanie dla Dockera. W swoim
supervisord.conf
zastąp to:z tym:
źródło