From 8830a6b4540c7d3620c2e64b31012d52b9a2ee7f Mon Sep 17 00:00:00 2001 From: Harald Heigl Date: Mon, 29 Oct 2018 09:08:32 +0100 Subject: [PATCH 1/2] Changed system to only one docker-api request, api-request now only gets unhealthy containers --- docker-entrypoint | 35 ++++++++++------------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index b0921af..18b8f1a 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -18,44 +18,29 @@ trap 'kill ${!}; term_handler' SIGTERM if [ "$1" = 'autoheal' ] && [ -e ${DOCKER_SOCK} ]; then - mkdir -p $TMP_DIR - # https://docs.docker.com/engine/api/v1.25/ # Set container selector if [ "$AUTOHEAL_CONTAINER_LABEL" == "all" ]; then - selector() { - jq -r .[].Id - } + labelFilter="" else - selector() { - jq -r '.[] | select(.Labels["'${AUTOHEAL_CONTAINER_LABEL:=autoheal}'"] == "true") | .Id' - } + labelFilter=",\"label\":\[\"${AUTOHEAL_CONTAINER_LABEL:=autoheal}=true\"\]" fi echo "Monitoring containers for unhealthy status" while true; do sleep ${AUTOHEAL_INTERVAL:=5} - - CONTAINERS=$(docker_curl -XGET http://localhost/containers/json | selector) - for CONTAINER in $CONTAINERS; do - HEALTH=$(docker_curl -XGET http://localhost/containers/${CONTAINER}/json | jq -r .State.Health.Status) - if [ "unhealthy" = "$HEALTH" ]; then + + apiUrl="http://localhost/containers/json?filters=\{\"health\":\[\"unhealthy\"\]${labelFilter}\}" + docker_curl "$apiUrl" | jq -r 'foreach .[] as $CONTAINER([];[]; $CONTAINER | .Id, .Names[0])' | \ + while read -r CONTAINER_ID && read -r CONTAINER_NAME; do + CONTAINER_SHORT_ID=${CONTAINER_ID:0:12} DATE=$(date +%d-%m-%Y" "%H:%M:%S) - CONTAINER_NAME=$(docker_curl -XGET http://localhost/containers/${CONTAINER}/json | jq -r .Name) - echo "$DATE Container ${CONTAINER_NAME} (${CONTAINER:0:12}) found to be unhealthy" - touch "$TMP_DIR/$CONTAINER" - fi - done - for CONTAINER in `ls $TMP_DIR`; do - DATE=$(date +%d-%m-%Y" "%H:%M:%S) - CONTAINER_NAME=$(docker_curl -XGET http://localhost/containers/${CONTAINER}/json | jq -r .Name) if [ "null" = "$CONTAINER_NAME" ]; then - echo "$DATE Delete container ${CONTAINER_NAME} (${CONTAINER:0:12}) from restart list because container name null implies container does not exist" - rm "$TMP_DIR/$CONTAINER" + echo "$DATE Container name of ($CONTAINER_SHORT_ID) is null, which implies container does not exist - don't restart" else - echo "$DATE Restarting container ${CONTAINER_NAME} (${CONTAINER:0:12})" - docker_curl -f -XPOST http://localhost/containers/${CONTAINER}/restart && rm "$TMP_DIR/$CONTAINER" || echo "$DATE Restarting container ${CONTAINER:0:12} failed" + echo "$DATE Container ${CONTAINER_NAME} ($CONTAINER_SHORT_ID) found to be unhealthy - Restarting container now" + docker_curl -f -XPOST http://localhost/containers/${CONTAINER_ID}/restart || echo "$DATE Restarting container $CONTAINER_SHORT_ID failed" fi done done From b1fe537daacfbf086d377c29c1923bc0430eb57f Mon Sep 17 00:00:00 2001 From: Harald Heigl Date: Mon, 29 Oct 2018 09:42:26 +0100 Subject: [PATCH 2/2] Removed tmp_dir (not needed anymore) --- docker-entrypoint | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-entrypoint b/docker-entrypoint index 18b8f1a..788ef3e 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -2,7 +2,6 @@ set -e DOCKER_SOCK=${DOCKER_SOCK:-/var/run/docker.sock} -TMP_DIR=/tmp/restart CURL_TIMEOUT=${CURL_TIMEOUT:-30} # SIGTERM-handler