docker -составить частоту повторных попыток проверки работоспособности! = Интервал - PullRequest
4 голосов
/ 03 февраля 2020

Я недавно настроил healthcheck s в моей конфигурации docker-compose.

Все отлично, и мне это нравится. Вот типичный пример:

services:
  app:
    healthcheck:
      test: curl -sS http://127.0.0.1:4000 || exit 1
      interval: 5s
      timeout: 3s
      retries: 3
      start_period: 30s

Мой контейнер загружается довольно медленно, поэтому я установил 30 секунд start_period.

Но это не совсем соответствует моим ожиданиям: мне не нужно проверять каждые 5 секунд, но мне нужно знать, когда контейнер готов в первый раз, как можно скорее для моей оркестровки, и с тех пор мой start_period является приблизительным, если он еще не готов при первой проверке, я должен подождать interval перед повторной попыткой.

Я хотел бы получить:

  • Пока контейнер не здоров, повторяйте каждые 5 секунд
  • Как только он исправен, проверяйте каждую 1 минуту

Нет ли способа добиться этого из-за -box с docker-compose?

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

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Я написал скрипт, который делает это, хотя я бы предпочел найти нативное решение:

#!/bin/sh

HEALTHCHECK_FILE="/root/.healthchecked"

COMMAND=${*?"Usage: healthcheck_retry <COMMAND>"}

if [ -r "$HEALTHCHECK_FILE" ]; then
  LAST_HEALTHCHECK=$(date -r "$HEALTHCHECK_FILE" +%s)
  # FIVE_MINUTES_AGO=$(date -d 'now - 5 minutes' +%s)
  FIVE_MINUTES_AGO=$(echo "$(( $(date +%s)-5*60 ))")
  echo "Healthcheck file present";
  # if (( $LAST_HEALTHCHECK > $FIVE_MINUTES_AGO )); then
  if [ $LAST_HEALTHCHECK -gt $FIVE_MINUTES_AGO ]; then
    echo "Healthcheck too recent";
    exit 0;
  fi
fi

if $COMMAND ; then
  echo "\"$COMMAND\" succeed: updating file";
  touch $HEALTHCHECK_FILE;
  exit 0;
else
  echo "\"$COMMAND\" failed: exiting";
  exit 1;
fi

, которое я использую: test: /healthcheck_retry.sh curl -fsS localhost:4000/healthcheck

Боль в том, что мне нужно убедитесь, что скрипт доступен в каждом контейнере, поэтому для этого мне нужно создать дополнительный том:

    image: postgres:11.6-alpine
    volumes:
      - ./scripts/utils/healthcheck_retry.sh:/healthcheck_retry.sh
1 голос
/ 13 февраля 2020

К сожалению, это невозможно из коробки.
Все установленные длительности являются окончательными. Они не могут быть изменены в зависимости от состояния контейнера.

Однако, согласно документации , зонд, по-видимому, не ждет, пока start_period завершится sh, прежде чем проверять твой тест Единственное, что он делает, это то, что любой сбой, произошедший во время start_period, не будет считаться ошибкой.

Ниже приведено предложение, которое заставляет меня думать, что:

start_period обеспечивает время инициализации для контейнеров, которым требуется время bootstrap. Отказ зонда в течение этого периода не будет засчитан в максимальное количество попыток. Однако, если проверка работоспособности прошла успешно в течение начального периода, контейнер считается запущенным, а все последующие отказы будут засчитаны в максимальное количество. повторных попыток.

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

...