宝塔Docker容器启动后自动退出的主因是主进程秒退,常见原因包括脚本路径错误、CRLF行尾、缺少执行权限、shebang错误、OOM(ExitCode 137)或端口冲突;需用docker inspect查退出码、docker run -it复现并观察实时报错。

宝塔面板 Docker 容器启动后自动退出,大概率不是面板本身问题,而是容器没跑起来——根本原因是主进程(PID 1)秒退,而日志里往往藏着那行关键报错。
docker logs 看不到输出?说明进程根本没活过初始化
执行 docker logs baota 返回空或只有几行就结束,基本可判定:入口命令在加载阶段就失败了,连日志写入机会都没有。常见原因包括:
-
ENTRYPOINT或CMD指向的脚本路径不存在(比如镜像里没放/www/server/panel/pyenv/bin/python) - 脚本有
CRLF行尾(Windows 编辑保存),导致/bin/sh: bad interpreter: No such file or directory - 缺少执行权限:
docker run --rm -it xxx.xuanyuan.run/btpanel/baota:latest ls -l /www/server/panel/script/start.py看是否含x - shebang 错误:脚本第一行写
#!/usr/bin/env python3,但镜像里只有python(无python3命令)
用 docker inspect 确认退出码和终止时间
运行 docker inspect baota | grep -A 5 "State",重点看两个字段:
-
"ExitCode": 127→ 命令未找到(如python3不存在、start.py路径错) -
"ExitCode": 137→ OOM 被内核杀掉(宝塔吃内存多,没设-m限制时极易触发) -
"FinishedAt"和"StartedAt"时间差小于 1 秒 → 真·秒退,不是服务启动慢
注意:如果 ExitCode 是 0,且 Status 显示 exited,说明是正常完成(比如启动脚本里写了 exit 0 后直接结束)——这不是故障,是设计如此。
交互式运行复现问题,定位阻塞点
别只靠 docker logs 猜,直接进容器看实时输出:
- 停掉原容器:
docker stop baota - 用
-it启动并覆盖入口:docker run -it --rm --name baota-test -v ~/website_data:/www/wwwroot -v ~/mysql_data:/www/server/data xxx.xuanyuan.run/btpanel/baota:latest /bin/sh -c "/www/server/panel/script/start.py" - 观察终端输出:卡在哪一行?报什么错?是不是卡在连接 MySQL、读取配置、检查端口占用?
特别注意:宝塔启动时会检测 8888 端口是否被占。若宿主机已有进程占了该端口,它不会报“port in use”,而是静默退出(退出码 1)。用 netstat -tuln | grep :8888 提前确认。
restart 策略不能掩盖根本问题
--restart unless-stopped 让容器反复重启,但每次都是同一错误路径,只会刷屏日志。更危险的是:
- 退出码 137(OOM)+
always策略 → 容器不断拉起又崩,拖垮整台机器 - 端口冲突或配置缺失 → 每次重启都失败,形成死循环
真正要做的,是先用交互方式跑通一次,确认 start.py 能打出 Starting Bt-Panel... 这类提示,再切回 -d 后台模式。否则,日志里永远只有那一行 exit code,没有上下文。


















