docker wait命令用于阻塞等待指定容器停止并返回其退出代码,支持单个或多个容器,是自动化脚本中实现任务同步与状态捕获的核心工具。
docker 没有原生的 dockerwait 指令。你可能是指 docker wait 命令——它是 docker cli 提供的用于阻塞等待容器停止并返回其退出码的核心命令,常被用于脚本中实现状态捕获与运维联动。
下面直接说明如何在 Shell 脚本中正确使用 docker wait 捕获退出状态,并衔接常见运维动作(如日志归档、告警通知、自动重启、清理资源等):
用 docker wait 获取精确退出码
`docker wait` 会挂起当前 shell 进程,直到指定容器停止,然后直接以容器的退出状态码作为自身退出码返回。这是它区别于轮询或 `docker ps` 的关键优势——**无竞态、零延迟、精准可靠**。
示例:
container_id=$(docker run -d nginx:alpine) docker wait "$container_id" # 阻塞,直到容器退出 exit_code=$? echo "容器退出码:$exit_code"
结合容器启动模式做状态分流
退出码本身不带语义,需结合容器启动方式(如 `--restart` 策略、是否前台运行、是否故意 exit)来判断含义。常见场景建议如下:
-
退出码 0:通常表示正常终止(如主动调用
exit 0、服务优雅关闭)→ 可触发归档、报告完成 - 退出码非 0(1–255):大概率异常退出 → 应立即采集日志、发告警、标记故障
- 容器被 kill(如 SIGKILL):退出码一般为 137(128+9),可识别为 OOM 或手动终止
- 容器未启动成功即退出(如 ENTRYPOINT 报错):退出码往往为 1 或 127 → 需检查镜像或配置
脚本中串联运维动作(实用模板)
以下是一个轻量但完整的联动脚本片段,支持日志快照、条件告警、退出码分类处理:
#!/bin/bash CONTAINER_NAME="my-app" <h1>启动并获取 ID(建议加 --rm 或命名便于管理)</h1><p>CID=$(docker run -d --name "$CONTAINER_NAME" myapp:latest)</p><h1>等待退出,捕获状态</h1><p>docker wait "$CONTAINER_NAME" EXIT_CODE=$?</p><h1>保存最后一屏日志(非全量,防卡顿)</h1><p>docker logs "$CONTAINER_NAME" --tail 200 > "/var/log/myapp/last-run-$(date +%s).log"</p><h1>分类响应</h1><p>case $EXIT_CODE in 0) echo "[OK] $CONTAINER_NAME 正常退出"</p><h1>可触发数据落盘、指标上报、通知运维看板</h1><pre class="brush:php;toolbar:false;">;;
1|2|127) echo "[ERROR] 启动失败或运行报错(code $EXIT_CODE)" curl -X POST -H 'Content-Type: application/json' \ -d '{"alert": "App failed to start", "code": '"$EXIT_CODE"}' \ https://www.php.cn/link/ccf12a05a73d0c53d2bd40074f4a2fcc ;; 137) echo "[OOM] 容器被系统 kill(内存超限)" docker inspect "$CONTAINER_NAME" | jq '.[0].HostConfig.Memory' # 检查限制 ;; *) echo "[UNEXPECTED] 未知退出码 $EXIT_CODE" ;; esac
清理(按需保留或删除)
docker rm "$CONTAINER_NAME" >/dev/null 2>&1
进阶建议:避免常见陷阱
-
不要用
docker ps -q轮询替代wait:轮询有延迟、消耗资源,且无法精确捕获瞬时退出码 -
容器必须处于 running 状态才能 wait:如果容器已退出,
docker wait会立刻返回历史退出码;但若容器根本没启动成功(如镜像拉取失败),docker run本身就会失败,不会生成有效 CID -
在 CI/CD 或 Job 类场景中,务必设置超时:可用
timeout 300 docker wait $cid防止无限挂起 -
多容器协调?用
docker-compose wait(v2.21+)或并行 wait + wait -n:原生命令不支持多容器 wait,需自行封装
不复杂但容易忽略:docker wait 是少数几个能把容器生命周期事件转化为 shell 退出码的命令,善用它,就能让脚本真正“感知”容器行为,而不是靠猜或查。











