Files
docker-autoheal/docker-entrypoint
T
will Farrell 11d4d0eb22 init commit
2017-02-11 19:19:32 -07:00

39 lines
1.3 KiB
Bash
Executable File

#!/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