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 uninit.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/