Я не верю, что у вас может быть переменный интервал проверки здоровья, поэтому я буду вызывать команду 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, но если это возможно, было бы лучше использовать его в качестве кода завершения, когда присутствует файл блокировки, чтобы не ошибочно сообщать о исправном состоянии, когда нет проверка здоровья была действительно предпринята.