usar que hub ejemplos desde como cero linux signals docker

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:

  1. Obtención del ID del contenedor - docker ps | grep yourProgramName - para mí se ve así - 4b6425cf4261
  2. Inicie sesión en el contenedor utilizando el docker exec -it 4b6425cf4261 bash
  3. Listar todos los procesos en ejecución con ps -A
  4. Encuentre el PID del proceso al que desea enviar un SIGINT a
  5. Envíele la señal: kill -SIGINT PID (ejemplo: kill -SIGINT 15)


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 servicio init.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