给 cron 容器加了 healthcheck,状态一直 unhealthy,但容器里的任务跑得好好的,日志一切正常。
查了半天:
docker inspect 容器名 --format '{{json .State.Health}}'
发现每次检测 ExitCode=1、Output 是空的。空的输出说明命令根本没执行成功,而不是判断不通过。
根因:这条 healthcheck 是从基础镜像继承来的,测的是容器里不存在的命令。alpine 系镜像没有 curl,只有 wget;debian 系 slim 镜像也常缺 curl。
三种处理,按场景选:
- 任务型容器(cron、一次性迁移)根本不需要健康检查,直接关掉:compose 里 healthcheck.disable: true
- 需要探活就换成镜像里确实有的命令,比如 wget -q --spider http://127.0.0.1:8080/health
- 自己写脚本,用 nc -z 或 /dev/tcp 探端口,兼容性最好
顺带一句:healthcheck 的 interval 别设太短,这机器上 cron 每 10 秒跑一次检测,一年多就是三百万次进程创建,纯浪费。
主楼healthcheck 空输出这个特征值得记:有输出说明命令跑了判断没过,没输出基本就是命令本身不存在。
继续逛逛