GNU/Linux >> Linux Esercitazione >  >> Linux

Come inviare un segnale al programma eseguito in un contenitore docker?

  • docker kill utilizzato per inviare il segnale al processo del contenitore principale, ad esempio il processo con PID 1.
  • Qualsiasi applicazione con PID 1 può gestire direttamente i segnali. Sotto il comando termina il processo docker principale:$ docker kill --signal="SIGTERM" container-id/name
  • Ma l'applicazione che non ha PID 1, cioè l'applicazione è un processo in background:
    • Non possiamo inviare single direttamente a nessun processo in background in esecuzione all'interno del contenitore docker.
    • In questo caso dobbiamo intercettare e gestire il segnale definito dall'utente nello script della shell in esecuzione come punto di ingresso.
  • Otteniamo il seguente Dockerfile . (Aggiornalo secondo l'applicazione)
FROM centos:6.7
# Install/Deploye the service below.

# Copy the shell script.
COPY entrypoint.sh /home
EXPOSE 8080
ENTRYPOINT ["/home/entrypoint.sh"]
  • Di seguito è riportato il entrypoint.sh . (Aggiornalo secondo l'applicazione). Supponiamo di voler riavviare un init.d servizio.

    #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
    
  • Crea l'immagine docker ed esegui il container.
  • Ora puoi riavviare il servizio dalla macchina Host:$docker kill --signal="SIGUSR1" container-id/name

Puoi usare docker kill --signal="<signal>" <container name or id> per inviare qualsiasi segnale al processo root di un dato contenitore.

Vedi https://docs.docker.com/engine/reference/commandline/kill/#send-a-custom-signal--to-a-container


Puoi usare nsenter per entrare nel tuo spazio container e inviare il tuo segnale.

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>

Maggiori informazioni:http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/


Linux
  1. Come eseguire un programma all'interno di un contenitore Docker?

  2. Come uscire da un container Docker

  3. Come eseguire Nginx all'interno di un contenitore Docker senza interruzioni?

  4. Come aggiungere utenti al contenitore Docker?

  5. Come eseguire un cron job all'interno di un contenitore docker

Come eseguire Grafana in un contenitore Docker

Come eseguire i contenitori Docker

Come SSH in un Docker Container

Come gestire i container Docker

Modi brillanti su come eseguire un programma in Linux

Come scrivere ed eseguire un programma C in Linux