Есть ли способ запустить docker проверок здоровья на ранней стадии? - PullRequest
0 голосов
/ 17 января 2020

Я использую следующий код bash, чтобы убедиться, что контейнер docker исправен и исправен, прежде чем продолжить. Однако мой текущий интервал проверки работоспособности установлен на 30 секунд, в результате этого l oop будет почти всегда ждать 30 секунд, даже если контейнер фактически готов через 1 секунду. Я не хочу уменьшать интервал, потому что проверка работоспособности использует curl, и я не хочу спамить свой access_log. В идеале я хотел бы провести первую проверку здоровья через 5 секунд вместо 30, а затем после этих 30 секундных интервалов между проверками.

maxcounter=60
counter=1
# Wait until the container is launched and healthy before continuing
until [ "$(docker inspect -f {{.State.Health.Status}} $CONTAINER)" == "healthy" ]; do
    if [ $counter -gt $maxcounter ]; then
        echo "We have been waiting for the container ($CONTAINER) for too long already; failing."
        echo "\nContainer state:"
        docker inspect -f '{{json .State}}' $CONTAINER | jq
        echo "\nContainer logs:"
        docker logs $CONTAINER
        exit 1
    fi;
    sleep 1
    counter=$(expr $counter + 1)
done;

Ответы [ 2 ]

1 голос
/ 17 января 2020

Я не верю, что у вас может быть переменный интервал проверки здоровья, поэтому я буду вызывать команду healthcheck каждые пять секунд и позволять ей решать, должен ли он пропустить свой действительный код или выполнить его.

Если вы можно использовать lockfile пакета procmail, я бы реализовал его следующим образом:

lockfile -0 -r 0 -l 30 /tmp/healthlock || exit 0
<actual healthcheck code>

Эта команда lockfile создаст файл блокировки /tmp/healthlock, который будет действовать в течение 30 секунд.

При первом вызове сценария такого файла не должно быть, поэтому команда вернется с успехом, и вы продолжите с действительным кодом проверки работоспособности.

Следующие 5 раз (через 10-30 секунд после запуска контейнера, через 5-25 секунд после создания первой блокировки) файл блокировки будет существовать и оставаться действительным, поэтому команда lockfile вернет код выхода, отличный от 0, и скрипт немедленно завершится.

В следующий раз (через 35 секунд после запуска контейнера, через 30 секунд после создания первой блокировки) первая блокировка будет отменена, а команда lockfile создаст новую, действительную еще 30 секунд. и вернет код завершения 0, позволяя выполнить остальной код.

Обратите внимание, что проблема этого решения будет в том, что когда команда healthcheck завершает работу из-за блокировки, ее код выхода по-прежнему будет приниматься учитывать состояние здоровья. Я не знаю, можно ли получить доступ к ранее сообщенному состоянию работоспособности с помощью команды healthcheck, но если это возможно, было бы лучше использовать его в качестве кода завершения, когда присутствует файл блокировки, чтобы не ошибочно сообщать о исправном состоянии, когда нет проверка здоровья была действительно предпринята.

0 голосов
/ 05 февраля 2020

Лично я решил просто сократить свой интервал до 5 секунд вместо того, чтобы делать это, потому что я хочу сохранить функциональность повторов. Но вот грубый сценарий, который вы можете иметь в вашем docker контейнере и настроить его на проверку здоровья.

#!/bin/bash

function timedLock {
    lockfile-create /tmp/healthchecklock
    sleep 30
    lockfile-remove /tmp/healthchecklock
}

function healthcheckExit {
    # Write the response of the most recent healthcheck to a file
    echo -n $1 > /tmp/healthcheckCode
    exit $1
}

# If lock exists then we've already run a healthcheck within the last 30 seconds
if lockfile-check /tmp/healthchecklock; then
    # Since we don't want to do a healthcheck we simply respond with the last exit code
    exit $(cat /tmp/healthcheckCode)
fi

# Create a lockfile so that we don't run another check for the next 30 seconds
timedLock&
# If the commands fail then we exit 1 (unhealthy), if they don't fail we exit 0 (healthy)
if cgi-fcgi -bind -connect localhost:9001 && curl --fail "http://localhost:80$HEALTHCHECK_PATH"; then
    healthcheckExit 0
else
    healthcheckExit 1
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...