[英]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
才能重試。
我想要的是:
沒有辦法用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.