如何为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
相关产品推荐
相关产品推荐

