Executo o docker container com supervisor como este:
Dockerfile
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}
Depois que o produtor parou, eu tenho:
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
mas o servo-agente mantém o contêiner no estado de execução. Quero parar o contêiner do Docker quando o produtor concluir seu trabalho corretamente com o status 0. Tentei associar processos a um grupo, mas parece que não funciona. Gente, o que eu pulei? Ajude-me, por favor!
linux
docker
process
supervisord
containers
Vitaly Velikodny
fonte
fonte
Respostas:
Resolvi o problema com o supervisor eventlistener :
kill.py
Também bom gerenciamento de processos de artigos em contêineres de encaixe
fonte
Aqui está uma versão um pouco mais simplificada, que utiliza um script de shell em vez de um script python, e também abrange vários serviços, matando todo o supervisor se um deles falhar.
supervisord.conf stop-supervisor.shReferências
fonte
Aqui está uma solução simples para o Docker. No seu
supervisord.conf
, substitua isto:com isso:
fonte