Docker Compose --wait未等待Loki健康检查问题求助
问题分析
你的Docker Compose中Loki的健康检查完全失效,甚至exit 1这种强制失败的配置都被标记为healthy,核心原因主要有两个:
- Loki镜像未预装curl:grafana/loki:2.4.0基于Alpine镜像,默认没有安装curl,导致健康检查命令执行失败,但Docker在命令不存在时会误判为健康状态。
- 健康检查命令格式错误:未用
CMD-SHELL包裹shell风格的命令,导致Docker无法正确解析执行逻辑。
另外你执行的compose命令存在语法错误(重复的down),虽非核心问题,但可能影响容器清理的彻底性。
解决方案
1. 替换健康检查工具(推荐)
用Alpine预装的wget替代curl,修改健康检查配置:
services: loki: # 保留原有其他配置 healthcheck: test: ["CMD-SHELL", "wget --spider --quiet http://127.0.0.1:3100/ready || exit 1"] interval: 10s timeout: 20s retries: 15 start_period: 30s # 给Loki足够的初始化启动时间
--spider参数让wget仅检查URL可达性,不下载内容,完美适配健康检查场景。
2. 先在Loki镜像中安装curl(可选)
如果坚持使用curl,可通过entrypoint先安装依赖:
services: loki: image: grafana/loki:2.4.0 # 保留原有其他配置 entrypoint: sh -c "apk add --no-cache curl && /usr/bin/loki -config.file=/etc/loki/local-config.yaml" healthcheck: test: ["CMD", "curl", "-f", "http://127.0.0.1:3100/ready"] interval: 10s timeout: 20s retries: 15 start_period: 30s
3. 修正compose命令
执行正确的启停命令:
# 彻底清理容器和关联卷 docker compose -f grafana.yaml down -v # 启动服务并等待健康状态就绪 docker compose -f grafana.yaml up --wait -d
4. 验证健康检查状态
启动后执行以下命令查看实际健康检查执行情况:
docker inspect grafana-loki-1 | grep -A 20 "Health"
若输出中显示Status: healthy且Log包含wget/curl的执行记录,说明健康检查已正常生效。
内容的提问来源于stack exchange,提问作者David Gomes
相关产品推荐
相关产品推荐

