GNU/Linux >> Tutoriels Linux >  >> Linux

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

  • docker kill utilisé pour envoyer un signal au processus de conteneur principal, c'est-à-dire le processus avec le PID 1.
  • Toute application avec PID 1 peut gérer directement les signaux. La commande ci-dessous tue le processus docker principal :$ docker kill --signal="SIGTERM" container-id/name
  • Mais l'application qui n'a pas le PID 1, c'est-à-dire que l'application est un processus d'arrière-plan :
    • Nous ne pouvons pas envoyer de single directement à un processus d'arrière-plan s'exécutant dans le conteneur Docker.
    • Dans ce cas, nous devons piéger et gérer le signal défini par l'utilisateur dans le script shell exécuté comme point d'entrée.
  • Prenons le Dockerfile suivant . (Mettre à 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 le entrypoint.sh . (Mettez-le à jour selon l'application). Supposons que nous voulions redémarrer un init.d services.

    #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éer l'image docker et exécuter le conteneur.
  • Vous pouvez maintenant redémarrer le service depuis la machine hôte :$docker kill --signal="SIGUSR1" container-id/name

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


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'infos :http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/


Linux
  1. Comment exécuter un programme dans un conteneur Docker ?

  2. Comment exécuter MySQL dans un conteneur Docker

  3. Comment exécuter une commande sur un conteneur Docker en cours d'exécution

  4. Comment quitter un conteneur Docker

  5. Comment exécuter Nginx dans un conteneur Docker sans s'arrêter ?

Comment exécuter Grafana dans un conteneur Docker

Comment exécuter des conteneurs Docker

Comment se connecter en SSH à un conteneur Docker

Comment gérer les conteneurs Docker

Brilliant Ways sur la façon d'exécuter un programme sous Linux

Comment écrire et exécuter un programme C sous Linux