docker wait 命令通过 waitpid() 直接监听容器 PID 退出,阻塞 shell 并输出容器退出码;需确保容器已运行,其退出码(非命令自身退出码)可用于脚本判断,适用于 CI/CD 同步、清理等场景。`docker wait` 是一个轻量级命令,专门用于阻塞当前 shell,直到指定容器退出并返回其退出码。它不依赖日志、状态轮询或信号监听,而是直接监听容器的 PID 消失(底层通过 `waitpid()` 系统调用),因此响应及时、开销极低,适合脚本中做精确的生命周期同步。
核心用法很简单:
docker wait <container> —— 执行后立即挂起当前 shell,直到容器进程终止,然后输出退出码(0 表示正常退出,非 0 表示异常或被杀)。
确保容器已启动再 wait
如果目标容器尚未运行,docker wait 会立刻报错并退出(如 No such container)。所以通常需先启动或确认容器处于 running 状态:
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
- 启动后立即 wait:
docker run -d --name myapp nginx:alpine && docker wait myapp - 或配合
docker start使用:docker start myapp && docker wait myapp - 避免竞态:不要依赖“刚创建就 wait”,因为 created ≠ running;可用
docker inspect -f '{{.State.Status}}' myapp做简单校验(可选)
捕获退出码做后续判断
docker wait 的退出码始终为 0(命令执行成功),但标准输出是容器本身的退出码(如 0、1、137、143)。可通过命令替换捕获:
exit_code=$(docker wait myapp)if [ "$exit_code" = "0" ]; then echo "success"; else echo "failed with $exit_code"; fi- 注意:若容器被 SIGKILL(如
docker kill -9)终止,退出码通常是 137;被 SIGTERM 正常终止,常为 0 或 143(取决于应用是否捕获并 exit(143))
与 docker run -i/-t 的区别
别混淆 docker wait 和前台运行:docker run alpine echo hello 本身就会阻塞,因为默认 attach 并等待;
而 docker run -d alpine sleep 5 启动后台容器,此时必须用 docker wait 才能同步结束时机。docker wait 不接管 stdin/stdout,也不影响容器日志,纯粹是“守着 PID 看它死没死”。
实用场景举例
- CI/CD 中串行执行:启动测试容器 → wait → 根据退出码决定是否归档日志或触发告警
- 组合式清理:启动临时 DB 容器 → 运行迁移脚本 →
docker wait db-migrate→ 再docker rm db-migrate - 避免 race condition:在
docker stop后加wait,确保容器真正退出后再操作卷或网络

















