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?
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"
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/
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