linux - que - ¿Cómo enviar señal a programa ejecutado en un contenedor docker?
dockerfile ejemplos (4)
Tengo un programa ejecutado en un contenedor docker con modo separado.
Entonces, ¿cómo enviar una señal como SIGINT a este programa?
Logré enviar una señal que deseo a un proceso (programa) en el contenedor de la ventana acoplable por medio de:
- Obtención del ID del contenedor - docker ps | grep yourProgramName - para mí se ve así - 4b6425cf4261
- Inicie sesión en el contenedor utilizando el docker exec -it 4b6425cf4261 bash
- Listar todos los procesos en ejecución con ps -A
- Encuentre el PID del proceso al que desea enviar un SIGINT a
- Envíele la señal: kill -SIGINT PID (ejemplo: kill -SIGINT 15)
Puede usar el docker kill --signal="<signal>" <container name or id>
para enviar cualquier señal al proceso raíz de un contenedor determinado.
Consulte http://docs.docker.com/engine/reference/commandline/kill/
Puede usar nsenter para ingresar al espacio de su contenedor y enviar su señal.
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid kill -SIGINT <PID of your program inside your container>
Más información: http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/
-
docker kill
utiliza para enviar la señal al proceso del contenedor principal, es decir, el proceso con PID 1. - Cualquier aplicación con PID 1 puede manejar señales directamente. Debajo del comando, elimine el proceso de la ventana acoplable principal:
$ docker kill --signal="SIGTERM" container-id/name
- Pero la aplicación que no tiene PID 1, es decir, la aplicación es un proceso en segundo plano:
- No podemos enviarlo directamente a ningún proceso en segundo plano que se ejecute dentro del contenedor de la ventana acoplable.
- En este caso, necesitamos atrapar y manejar la señal definida por el usuario en el script de shell que se ejecuta como punto de entrada.
- Vamos a tener el siguiente
Dockerfile
. (Actualízalo según la aplicación)
FROM centos:6.7
# Install/Deploye the service below.
# Copy the shell script.
COPY entrypoint.sh /home
EXPOSE 8080
ENTRYPOINT ["/home/entrypoint.sh"]
A continuación se muestra el punto de
entrypoint.sh
. (Actualízalo según la aplicación). Supongamos que queremos reiniciar un servicioinit.d
#start the service /etc/init.d/<servicename> start pid="$!" # SIGUSR1- Single handler my_handler() { /etc/init.d/<servicename> restart } # Trap and handle the user defind singnal. trap ''my_handler'' SIGUSR1 # wait forever(Alive container.) while true do tail -f /dev/null & wait ${!} done
- Construye la imagen de la ventana acoplable y ejecuta el contenedor.
- Ahora puede reiniciar el servicio desde la máquina Host:
$docker kill --signal="SIGUSR1" container-id/name