[英]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.