You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为HomeAssistant Satellite容器配置基于日志的Docker健康检查?

正确的Docker Compose健康检查配置方向

1. 修正日志检查的逻辑错误

你当前的健康检查逻辑完全颠倒了:grep -i 'ERROR' || exit 1 意味着找到ERROR时返回成功(0),没找到才返回失败(1),这和实际需求完全相反。正确逻辑应该是:如果日志中出现目标ERROR,就让健康检查失败(返回非0),否则返回成功(0)。

修正后的配置:

healthcheck:
  test: ["CMD-SHELL", "docker logs $$(hostname) 2>&1 | grep -i 'Cannot write to closing transport' && exit 1 || exit 0"]
  interval: 1m
  timeout: 10s
  retries: 1
  start_period: 60s
  • 用$$(hostname)替代固定容器名,适配Compose中容器自动生成的命名规则,避免硬编码问题
  • 精准匹配你日志中出现的Cannot write to closing transport错误,避免误判其他无关ERROR
  • 逻辑调整为:找到目标错误就exit 1(标记容器不健康),未找到则exit 0(标记健康)

2. 更可靠的健康检查方式:直接验证WebSocket连接

日志检查属于事后判断,更优方案是直接验证卫星与Home Assistant的WebSocket连接状态。如果容器内装有websocat工具,可使用以下配置:

healthcheck:
  test: ["CMD-SHELL", "websocat -t ws://<你的Home Assistant地址>/api/websocket -e 'ping' || exit 1"]
  interval: 30s
  timeout: 5s
  retries: 2
  start_period: 60s

若容器内无websocat,也可用curl验证WebSocket握手(仅能检查连接初始化状态):

healthcheck:
  test: ["CMD-SHELL", "curl -s -o /dev/null -w '%{http_code}' http://<你的Home Assistant地址>/api/websocket | grep -q 101 || exit 1"]

3. 配置容器自动重启策略

健康检查标记容器不健康后,需让Docker自动重启容器,需在Compose服务中添加重启规则:

services:
  homeassistant-satellite:
    image: ghcr.io/synesthesiam/homeassistant-satellite
    # ...其他配置项...
    healthcheck:
      # 上述正确的健康检查配置
    restart: on-failure:3  # 连续失败3次后重启,也可使用always/unless-stopped规则

4. 解决容器内权限问题

若使用docker logs的检查方式,默认容器内无Docker命令权限,需挂载Docker套接字(存在一定安全风险,优先推荐WebSocket直连检查):

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

内容的提问来源于stack exchange,提问作者Ignacio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:32:42