2014-09-05 7 views

risposta

9

È possibile utilizzare nsenter per accedere al proprio spazio contenitore e inviare il 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/

+5

Ora è possibile utilizzare 'docker exec' anziché nsenter. https://docs.docker.com/reference/commandline/exec/ – Andy

41

È possibile utilizzare docker kill --signal="<signal>" <container name or id> per inviare alcun segnale per il processo principale di un determinato contenitore.

Vedi http://docs.docker.com/engine/reference/commandline/kill/

+0

Sì, ma il programma a cui voglio inviare il segnale è un programma eseguito nel contenitore ma non al processo di root. per esempio. eseguire una bash in una finestra mobile, quindi eseguire un altro comando nella bash nella finestra mobile. Grazie per la tua risposta. – atupal

3
  • docker kill utilizzata per inviare il segnale di processo principale cioè processo contenitore con PID 1.
  • Qualsiasi applicazione con PID 1 può gestire direttamente segnali. Sotto il comando di uccidere il processo di finestra mobile principale: $ docker kill --signal="SIGTERM" container-id/name
  • ma l'applicazione che non ha PID 1 applicazione cioè è processo in background:
    • Non possiamo trasmettere singolo direttamente a qualsiasi processo in background in esecuzione all'interno del contenitore finestra mobile.
    • In questo caso è necessario intercettare e gestire il segnale definito dall'utente nello script della shell in esecuzione come punto di ingresso.
  • Abbiamo il seguente Dockerfile. (Aggiornarlo come per 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"] 

  • riportano di seguito le entrypoint.sh. (Aggiornalo come da applicazione). Supponiamo di voler riavviare un servizio 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 
    
  • Costruire l'immagine della finestra mobile ed eseguire il contenitore.
  • Ora è possibile riavviare il servizio dalla macchina host: $docker kill --signal="SIGUSR1" container-id/name
0

sono riuscito a inviare un segnale che voglio un processo (programma) in un contenitore finestra mobile per:

  1. Ottenere l'ID del container - finestra mobile ps | grep yourProgramName - per me sembra così - 4b6425cf4261
  2. Entrata nel contenitore utilizzando finestra mobile exec -E 4b6425cf4261 bash
  3. Elenco di tutti i processi in esecuzione con ps -A
  4. Trova il PID del processo che si desidera inviare un SIGINT per
  5. Invia il segnale ad esso: kill -SIGINT PID (esempio: uccidere -SIGINT 15)
Problemi correlati