• laozhou

    给 cron 容器加了 healthcheck,状态一直 unhealthy,但容器里的任务跑得好好的,日志一切正常。

    查了半天:

    docker inspect 容器名 --format '{{json .State.Health}}'

    发现每次检测 ExitCode=1、Output 是空的。空的输出说明命令根本没执行成功,而不是判断不通过。

    根因:这条 healthcheck 是从基础镜像继承来的,测的是容器里不存在的命令。alpine 系镜像没有 curl,只有 wget;debian 系 slim 镜像也常缺 curl。

    三种处理,按场景选:

    1. 任务型容器(cron、一次性迁移)根本不需要健康检查,直接关掉:compose 里 healthcheck.disable: true
    2. 需要探活就换成镜像里确实有的命令,比如 wget -q --spider http://127.0.0.1:8080/health
    3. 自己写脚本,用 nc -z 或 /dev/tcp 探端口,兼容性最好

    顺带一句:healthcheck 的 interval 别设太短,这机器上 cron 每 10 秒跑一次检测,一年多就是三百万次进程创建,纯浪费。

    主楼
  • sanshi

    healthcheck 空输出这个特征值得记:有输出说明命令跑了判断没过,没输出基本就是命令本身不存在。

    #1

发表回复

登录后回复