Ejecuto el contenedor docker con un 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}
Después de que el productor se detuvo, tengo:
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
pero serf-agent mantiene el contenedor en estado de ejecución. Quiero detener el contenedor Docker cuando el productor complete su trabajo correctamente con el estado 0. Intenté unir procesos a un grupo pero parece que no funciona. Chicos, ¿qué me salté? ¡Ayudame por favor!
linux
docker
process
supervisord
containers
Vitaly Velikodny
fuente
fuente
Respuestas:
Resolví el problema con el supervisor eventlistener :
kill.py
También buena gestión de procesos de artículos en contenedores acoplables
fuente
Aquí hay una versión un poco más simplificada que utiliza un script de shell en lugar de un script de Python, y también cubre múltiples servicios, matando a todo el supervisor si alguno falla.
supervisord.conf stop-supervisor.shReferencias
fuente
Aquí hay una solución simple para Docker. En su
supervisord.conf
, reemplace esto:con este:
fuente