web-dev-qa-db-fra.com

Comment envoyer un signal au programme exécuté dans un conteneur Docker?

J'ai un programme exécuté dans un conteneur Docker avec le mode détaché.

Alors, comment envoyer un signal tel que SIGINT à ce programme?

28
atupal

Vous pouvez utiliser nsenter pour entrer dans votre espace conteneur et envoyer votre signal.

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>

Plus d'informations: http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/

11
Regan

Vous pouvez utiliser docker kill --signal="<signal>" <container name or id> pour envoyer n'importe quel signal au processus racine d'un conteneur donné.

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

63
Andy
  • docker kill utilisé pour envoyer le signal au processus de conteneur principal, c'est-à-dire au processus avec PID 1.
  • Toute application avec PID 1 peut gérer directement les signaux. La commande ci-dessous supprime le processus docker principal: $ docker kill --signal="SIGTERM" container-id/name
  • Mais l'application qui n'a pas de PID 1 c'est-à-dire l'application est un processus d'arrière-plan:
    • Nous ne pouvons pas envoyer de single directement à un processus d'arrière-plan exécuté dans le conteneur Docker.
    • Dans ce cas, nous devons intercepter et gérer le signal défini par l'utilisateur dans le script Shell exécuté comme point d'entrée.
  • Disons que nous avons le Dockerfile suivant. (Mettez-le à jour selon l'application)

FROM centos:6.7
# Install/Deploye the service below.

# Copy the Shell script.
COPY entrypoint.sh /home
EXPOSE 8080
ENTRYPOINT ["/home/entrypoint.sh"]

  • Ci-dessous est le entrypoint.sh. (Mettez-le à jour selon l'application). Supposons que nous voulons redémarrer un init.d un service.

    #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
    
  • Créez l'image docker et exécutez le conteneur.
  • Vous pouvez maintenant redémarrer le service à partir de la machine hôte: $docker kill --signal="SIGUSR1" container-id/name
7
Sudhanshu Dev

J'ai réussi à envoyer un signal que je veux à un processus (programme) dans le conteneur Docker en:

  1. Obtenir l'ID du conteneur - docker ps | grep yourProgramName - pour moi, ça ressemble à ça - 4b6425cf4261
  2. Connectez-vous au conteneur en utilisant docker exec -it 4b6425cf4261 bash
  3. Liste tous les processus en cours d'exécution avec ps -A
  4. Trouvez le PID du processus auquel vous souhaitez envoyer un SIGINT
  5. Envoyez-lui le signal: kill -SIGINT PID (exemple: kill -SIGINT 15)
1
hipokito