簡體   English   中英

docker-compose 健康檢查重試頻率 != 間隔

[英]docker-compose healthcheck retry frequency != interval

我最近在我的docker-compose配置中設置了healthcheck

它做得很好,我喜歡它。 下面是一個典型的例子:

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 分鍾檢查一次

沒有辦法用docker-compose實現這種開箱即用的docker-compose嗎?

我可以編寫一個自定義腳本來實現這一點,但如果可能的話,我寧願有一個本機解決方案。

不幸的是,這是不可能的。
所有的持續時間設置都是最終的。 它們不能根據容器狀態進行更改。

但是,根據 文檔,探針在檢查測試之前似乎不會等待start_period完成。 它唯一做的就是在 start_period 期間start_period任何故障都不會被視為錯誤。

下面是讓我想到的一句話:

start_period為需要時間引導的容器提供初始化時間。 在此期間的探測失敗將不計入最大重試次數。 但是,如果在啟動期間健康檢查成功,則認為容器已啟動,所有連續失敗都將計入最大重試次數。

我鼓勵您測試是否真的如此,因為我從未真正關注過是否在開始期間測試了健康檢查。
如果是這種情況,如果您不確定持續時間,您可能可以增加start_period並增加interval以找到一個好的折衷方案。

我編寫了一個執行此操作的腳本,但我更願意找到本機解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM