应综合State、Status、Created、StartedAt、FinishedAt和Health等字段判断容器生命周期;State.Status为权威运行状态,StartedAt与FinishedAt组合可确定当前是否运行及运行时长,RestartPolicy影响重启行为解释。
直接用 docker inspect 查看容器状态时,“生命周期状态”不是单一字段,而是分散在多个字段中的一组关键信息组合。你需要综合 status、state、created、startedat、finishedat 和 health 等字段,才能还原出容器从创建到当前时刻的完整生命周期脉络。
State 是 Docker 内部维护的底层运行时状态(如 running、exited、paused、restarting),反映容器进程的实际执行阶段;Status 是面向用户的简略描述(如 "Up 2 hours" 或 "Exited (0) 5 minutes ago"),由 Docker CLI 格式化生成,不用于程序解析。
建议始终以 .State.Status 为准判断当前状态,并结合 .State.StartedAt、.State.FinishedAt、.State.Restarting 等子字段判断是否处于重启循环或异常终止中。
一个容器的生命周期时间点需从以下字段拼合:
.Created:容器创建时间(ISO8601 格式,UTC).State.StartedAt:最近一次启动时间(容器可能被 stop/start 多次,此为最新一次).State.FinishedAt:最近一次退出时间(若容器仍在运行,值为 "0001-01-01T00:00:00Z").State.Health.Status(如有健康检查):反映应用层就绪状态,如 "healthy"、"unhealthy" 或 "starting"
例如,若 StartedAt 不为零且 FinishedAt 为零,说明容器当前正在运行;若两者均非零,则处于已退出状态,可据此计算运行时长:StartedAt → FinishedAt 即为本次运行周期。
避免手动翻阅冗长 JSON,推荐用 jq 提取结构化输出:
docker inspect CONTAINER_ID | jq ' { id: .[0].Id[:12], status: .[0].State.Status, created: .[0].Created, started: .[0].State.StartedAt, finished: .[0].State.FinishedAt, exit_code: .[0].State.ExitCode, oom_killed: .[0].State.OOMKilled, health: .[0].State.Health // null | .Status }'
该命令输出清晰的时间线三元组(创建、启动、结束)+ 退出码 + OOM 标记 + 健康状态,覆盖绝大多数生命周期诊断场景。
容器的重启策略(.HostConfig.RestartPolicy)会改变生命周期解释逻辑:
no:退出后不再启动,FinishedAt 即最终终点always 或 unless-stopped:即使退出也会自动重启,此时需关注 .State.Restarting 是否为 true,以及 .State.StartedAt 是否频繁更新on-failure:仅当非零退出码时重启,结合 .State.ExitCode 判断是否触发了重启行为单纯看 State.Status == "running" 不足以说明服务稳定 —— 若它刚从崩溃中被自动拉起,StartedAt 会非常新,而 FinishedAt 可能就在几秒前。