62 lines
1.7 KiB
Bash
62 lines
1.7 KiB
Bash
#!/bin/sh
|
|
set -eu
|
|
|
|
WATCH_CONTAINER="${WATCH_CONTAINER:?set WATCH_CONTAINER to the container name or id to watch}"
|
|
RESTART_CONTAINERS="${RESTART_CONTAINERS:?set RESTART_CONTAINERS to a comma-separated list of containers to restart}"
|
|
POLL_INTERVAL="${POLL_INTERVAL:-30}"
|
|
RESTART_DELAY="${RESTART_DELAY:-0}"
|
|
|
|
# Only restart when status *becomes* unhealthy (avoids restarting every poll while still unhealthy).
|
|
# Set RESTART_ON_EVERY_POLL=1 to restart on every poll while unhealthy.
|
|
RESTART_ON_EVERY_POLL="${RESTART_ON_EVERY_POLL:-0}"
|
|
|
|
log() {
|
|
printf '%s %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$*"
|
|
}
|
|
|
|
inspect_health() {
|
|
docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' "$1" 2>/dev/null || printf 'missing'
|
|
}
|
|
|
|
restart_list() (
|
|
IFS=','
|
|
for c in $RESTART_CONTAINERS; do
|
|
c=$(echo "$c" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
|
[ -z "$c" ] && continue
|
|
if docker restart "$c" 2>/dev/null; then
|
|
log "restarted: $c"
|
|
else
|
|
log "restart failed: $c"
|
|
fi
|
|
if [ "$RESTART_DELAY" != "0" ]; then
|
|
sleep "$RESTART_DELAY"
|
|
fi
|
|
done
|
|
)
|
|
|
|
prev=""
|
|
log "watching health of: $WATCH_CONTAINER (interval ${POLL_INTERVAL}s)"
|
|
log "will restart on unhealthy: $RESTART_CONTAINERS"
|
|
|
|
while true; do
|
|
status="$(inspect_health "$WATCH_CONTAINER")"
|
|
log "health status: $WATCH_CONTAINER = $status"
|
|
|
|
case "$status" in
|
|
missing)
|
|
log "watch target not found: $WATCH_CONTAINER"
|
|
;;
|
|
unhealthy)
|
|
if [ "$RESTART_ON_EVERY_POLL" = "1" ] || [ "$prev" != "unhealthy" ]; then
|
|
log "unhealthy — restarting configured containers"
|
|
restart_list
|
|
fi
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
prev="$status"
|
|
sleep "$POLL_INTERVAL"
|
|
done
|