容器exited状态说明主进程已终止,需通过退出码(如137为oom、143为sigterm)、日志和启动命令排查;cmd/entrypoint须前台长期运行;重启策略需结合内存限制与健康检查使用。

容器启动失败或秒退,核心是搞清它“为什么停”——不是崩溃,而是进程结束了。Docker 容器生命周期完全由 PID 1 进程决定:它一退出,容器就终止。所以排查重点不是“它崩了”,而是“它干完啥就走了”。
看状态和退出码,先定性
别急着删重试,先确认发生了什么:
-
docker ps -a | grep 容器名 —— 查看是否在列表里、状态是不是
Exited (X)或Created - docker inspect 容器名 --format='{{.State.Status}} {{.State.ExitCode}} {{.State.OOMKilled}}' —— 一行看清状态、退出码、是否被 OOM 杀掉
- 常见退出码含义:
0:正常退出(比如你运行了个脚本,执行完就退出)1:应用内部错误(日志里找 panic、配置缺失、命令不存在)137:被系统 kill(大概率内存超限 OOM)125:Docker 命令本身出错(比如镜像名写错、参数非法)
查日志,找第一手线索
日志是关键证据,但要注意:如果入口命令瞬间失败(如文件不存在、权限拒绝),可能根本没输出日志。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- docker logs 容器名 —— 最基础,看 stdout/stderr
- docker logs --tail 100 容器名 —— 日志太长时只看最后 100 行
- docker logs -t 容器名 —— 加时间戳,方便定位发生时刻
- docker logs --since "2h" 容器名 —— 查最近两小时日志
- 如果日志为空,说明进程可能连标准输出都没来得及打开,问题更底层(比如 CMD 指向的文件根本不存在,或权限不对)
验配置和依赖,盯住几个关键点
很多失败不是代码问题,而是环境没搭对:
-
端口冲突:启动时报
port is already allocated?用sudo lsof -i :8080或sudo netstat -tlnp | grep :8080查谁占着 -
挂载权限:宿主机目录挂进容器后提示
permission denied?检查目录属主、SELinux/AppArmor 策略,或加:z或:Z标签 - 健康检查失败:容器起来又退出,且反复重启?可能是健康检查(healthcheck)一直不通过,导致被自动 stop
-
依赖服务未就绪:比如应用启动要连 MySQL,但 db 容器还没 ready。可在应用启动脚本里加等待逻辑,或用
depends_on+ healthcheck 组合
进容器或模拟启动,做最终验证
当上面都看不出问题,就动手试:
-
去掉后台模式,前台运行:把
docker run -d改成docker run(不加 -d),直接看终端输出,错误立马可见 -
进容器手动跑命令:如果容器曾短暂运行过,用
docker start 容器名 && docker exec -it 容器名 sh,然后手动执行 CMD 中的命令,看报什么错 -
检查镜像内容:用
docker run --rm -it 镜像名 ls -l /app确认文件路径、权限、是否存在










