signal de piégeage de" docker stop " à bash

j'ai un script de point d'entrée dans un conteneur docker qui ressemble à quelque chose comme ceci:

#!/bin/bash

echo starting up

function shut_down() {
    echo shutting down

    pid=$(ps -e | grep myapp | awk '{print }')
    kill -SIGTERM $pid  
    exit
}

trap "shut_down" SIGKILL SIGTERM SIGHUP SIGINT EXIT

/opt/myapp

Je ne vois pas comment piéger le signal envoyé en exécutant docker stop sur le conteneur. Lors d'une exécution Interactive, a ctrl+c déclenchera comme prévu, mais un docker stop la commande attend juste les 10 Secondes d'arrêt, et sort sans jamais entrer dans le shut_down function

Comment puis-je piéger le signal envoyé par docker stop en bash pour faire du nettoyage?

16
demandé sur ben schwartz 2013-12-16 06:47:01

3 réponses

regardez , pourrait être source d'inspiration :-)

mise à jour:

@nick-humrich ici, c'est ma copie et mon passé lamer (le crédit va à l'auteur original https://github.com/lgierth)

#!/bin/bash

function ensure_started_container {
  exists=`docker ps -q | grep `
  if [ "$?" = "0" ] ; then
    echo "[docker-exec] skipping docker start, already started"
  else
    output=`docker start ""`
    echo "[docker start] $output"
  fi
  running=1
}

function setup_signals {
  cid=""; shift
  handler=""; shift
  for sig; do
    trap "$handler '$cid' '$sig'" "$sig"
  done
}

function handle_signal {
  echo "[docker-exec] received "
  case "" in
    SIGINT)
      output=`docker stop -t 5 ""`
      echo "[docker stop] $output"
      running=0
      ;;
    SIGTERM)
      output=`docker stop -t 5 ""`
      echo "[docker stop] $output"
      running=0
      ;;
    SIGHUP)
      output=`docker restart -t 5 ""`
      echo "[docker restart] $output"

      # restart logging
      docker attach "" &
      kill "$logger_pid" 2> /dev/null
      logger_pid="$!"
      ;;
  esac
}

running=0

setup_signals "" "handle_signal" SIGINT SIGTERM SIGHUP

ensure_started_container ""

docker attach "" &
logger_pid="$!"

while true; do
  if [ "$running" = "1" ]; then
    sleep 1
  else
    break
  fi
done

exit_code=`docker wait ""`
exit "$exit_code"
9
répondu Luca G. Soave 2015-12-14 19:25:46

Vieille question, mais cela fera l'affaire:

#!/bin/bash

echo starting up

exec /opt/myapp

Pour plus de détails jeter un oeil ici: http://www.techbar.me/stopping-docker-containers-gracefully/

12
répondu Alen Komljen 2015-07-27 11:32:51

depuis Docker 1.9, vous pouvez utiliser le STOPSIGNAL instruction dans votre Dockerfile:

STOPSIGNAL signal

STOPSIGNAL définit le signal d'appel système qui sera envoyé au conteneur à sortie. Ce signal peut être un nombre non signé qui correspond à un position dans la table syscall du noyau, par exemple 9, ou un signal nom dans le SIGNAME format, par exemple SIGKILL.

Source: https://docs.docker.com/engine/reference/builder/#stopsignal

2
répondu Maxime 2015-12-14 10:40:51