docker wait 是什么
wait 会阻塞当前终端直到指定容器退出,然后把容器的退出码打印出来。它的用途是把「容器什么时候跑完」变成脚本里可判断的一步:启动一个一次性任务容器,等它结束并拿到结果码,再决定后续流程。与之搭配的是后台启动(-d)与日志查看,构成脚本化编排的常用组合。
基本信息
| 语法 | docker wait 容器 [更多容器…] |
|---|---|
| 输出 | 容器退出码,多个容器时按顺序逐行打印 |
| 阻塞行为 | 容器不退出就一直等待,直到超时或人为中断 |
| 典型组合 | docker run -d 启动,docker wait 等待,docker logs 看输出 |
| 与 --rm 冲突 | 容器被自动删除后无法再取到退出码 |
| 适用平台 | 所有 Docker 环境;编排平台有自己的作业等待机制 |
典型使用场景
- 脚本里串行执行多个一次性任务:前一个完成后再启动下一个
- 数据迁移与初始化:等待容器结束并检查返回码决定是否继续
- 备份任务的编排:等待打包容器退出后再上传产物
- CI 中执行容器化测试,用退出码判断用例是否通过
- 排查偶发失败:多次运行并记录退出码分布
脚本化等待
脚本化等待
# 后台启动任务容器(注意不要加 --rm,否则退出后无法读退出码)
docker run -d --name job app/batch:1.0
# 阻塞等待并拿到退出码
exit_code=$(docker wait job)
echo "容器退出码: ${exit_code}"
# 失败时打印日志尾部,便于定位
docker logs --tail 50 job
# 用完手动清理容器
docker rm -f job
# 超时兜底:等待过久就人工终止,避免脚本永久挂住
# timeout 1800 bash -c 'docker wait job' || echo '等待超时'退出码后续动作
| 退出码 | 含义 | 脚本处理建议 |
|---|---|---|
| 0 | 任务正常完成 | 继续后续步骤 |
| 1 | 应用自身失败 | 打印日志并中断流程 |
| 137 | 被强制终止(常见内存超限) | 检查内存与限额后重试 |
| 143 | 收到终止信号 | 确认是否为人为停止 |
| 125 | Docker 层参数或守护进程问题 | 检查启动命令与环境 |
不要在服务型容器上使用 wait:常驻进程不会退出,命令会一直阻塞,脚本里应加超时保护或改用健康检查判断就绪。
使用 --rm 的短命容器可能在 wait 取到结果前就被删除,需要退出码时不要加该参数,改为事后手动清理。