#!/usr/bin/env sh set -e DOCKER_SOCK=/tmp/docker.sock if [ "$1" = 'autoheal' ] && [ -e ${DOCKER_SOCK} ]; then # https://docs.docker.com/engine/api/v1.25/ # Set container selector if [ "$AUTOHEAL_CONTAINER_LABEL" == "all" ]; then selector() { jq -r .[].Id } else selector() { jq -r '.[] | select(.Labels["'${AUTOHEAL_CONTAINER_LABEL:=autoheal}'"] == "true") | .Id' } fi echo "Monitoring containers for unhealthy status" while true; do CONTAINERS=$(curl --no-buffer -s -XGET --unix-socket ${DOCKER_SOCK} http://localhost/containers/json | selector) for CONTAINER in $CONTAINERS; do HEALTH=$(curl --no-buffer -s -XGET --unix-socket ${DOCKER_SOCK} http://localhost/containers/${CONTAINER}/json | jq -r .State.Health.Status) if [ "unhealthy" = "$HEALTH" ]; then echo "Container ${CONTAINER:0:12} found to be unhealthy. Restarting container ..." # Note: kill and stop didn't honor the restart policy #curl --no-buffer -s -XPOST --data '{"signal":"SIGKILL"}' --unix-socket ${DOCKER_SOCK} http://localhost/containers/${CONTAINER}/kill curl --no-buffer -s -XPOST --unix-socket ${DOCKER_SOCK} http://localhost/containers/${CONTAINER}/restart fi done sleep ${AUTOHEAL_INTERVAL:=5} done else exec "$@" fi