批量读取退出码的两种姿势
docker wait 阻塞等待容器退出并返回退出码,适合同步编排;docker inspect 读取已退出容器的 State.ExitCode,适合事后审计。两者配合循环可以给一批任务出结果表,是批处理与巡检脚本的常用组合。
基本信息
| docker wait | 阻塞直到容器退出并输出退出码 |
|---|---|
| docker inspect | 读取 State.ExitCode 等状态字段 |
| docker events | die 事件里带退出码属性,适合实时观察 |
| 适用场景 | 批处理编排、批量巡检、结果汇总 |
| 注意 | wait 只对已存在的容器有效 |
典型使用场景
- 批处理流水线:等一批任务结束再统一判断成败
- 巡检脚本:批量输出容器名与退出码的对照表
- 事故复盘:事后读取历史容器的退出码
- CI 里判断某个一次性任务是否成功
- 实时观察:订阅 die 事件,任务一结束就记录结果
等待与批量汇总
等待与批量汇总
docker run -d --name job1 app/batch:1.0
docker wait job1 # 阻塞等待并输出退出码
for c in $(docker ps -aq --filter name=job); do
echo "$c $(docker inspect -f '{{.State.ExitCode}}' $c)" # 批量读取退出码
done
docker events --filter event=die \
--format '{{.Actor.Attributes.name}} {{.Actor.Attributes.exitCode}}' # 实时观察三种取数方式
| 方式 | 适用时机 | 返回内容 |
|---|---|---|
| docker wait | 同步等待任务结束 | 退出码 |
| docker inspect | 事后或批量查询 | ExitCode 与状态字段 |
| docker events | 实时观察 | die 事件及退出码属性 |
| docker ps 过滤 | 批量定位容器 | 容器标识与状态 |
批量巡检脚本建议输出容器名、退出码与结束时间三个字段,方便与日志时间线对齐。
wait 只对已存在的容器有效,容器名写错会立刻报错而不是等待,脚本里要先校验容器是否存在。
events 的历史窗口有限,很久以前的退出要用 inspect 或集中日志回溯,别指望事件流能翻历史。
退出码只能说明进程怎么结束,具体原因还要结合容器日志;脚本里把两者一起采集,排障时更省事。
容器被删除后 inspect 就查不到了,需要长期留存的退出码要落盘或写入日志系统。
对一批容器做汇总时,要先过滤出已退出的容器再读取退出码:仍在运行的容器该字段没有实际意义,混进结果里会干扰判断。