如何防止代码出错时Docker容器自动关闭?
解决shotel_backend容器因代码错误退出(exited with code 1)的问题
你的问题很典型:当Django后端的runserver进程因为代码错误崩溃时,Docker会因为主进程终止而直接停止容器,就出现了shotel_backend exited with code 1的提示。下面给你分两个层面来解决:
一、快速阻止容器关闭:配置Docker自动重启策略
这是最快的临时解决方案,让容器在进程崩溃后自动重启,保证服务不会一直处于关闭状态。你只需要在docker-compose.yml的backend服务中添加restart配置项:
修改后的docker-compose.yml:
version: '3' services: backend: container_name: shotel_backend build: ./backend volumes: - ./backend/:/backend working_dir: /backend/ command: pipenv run python manage.py runserver 0.0.0.0:8000 ports: - 8000:8000 # 选择适合的重启策略,二选一即可 restart: always # 无论退出原因,都自动重启容器 # restart: unless-stopped # 除非手动停止容器,否则自动重启
二、彻底解决:定位并修复代码问题
重启策略只是“救急”,要从根源上解决容器退出的问题,你需要找到导致runserver崩溃的具体原因:
- 查看容器崩溃日志:执行
docker logs shotel_backend命令,查看崩溃时的错误堆栈信息,这能直接帮你定位到出错的代码位置; - 排查启动/运行时错误:
- 如果是启动阶段崩溃,大概率是
settings.py配置错误、依赖包缺失(可以检查pipenv install的输出,确认所有依赖都安装成功); - 如果是运行时崩溃,说明代码中存在未捕获的异常,你需要给关键逻辑添加
try-except块,避免异常直接导致进程终止;
- 如果是启动阶段崩溃,大概率是
- 生产环境优化:如果这是生产环境,不要用
runserver(它只是开发用的轻量服务器),改用gunicorn或uwsgi这类生产级服务器,它们在处理单个请求错误时不会导致整个进程崩溃。
开发环境小提示
在开发阶段,Django的runserver默认遇到代码错误时只会在浏览器展示错误页面,不会直接崩溃。如果你的runserver直接退出,建议先检查是否是语法错误或者严重的配置问题——这类错误会导致runserver启动失败或立即崩溃。
内容的提问来源于stack exchange,提问作者Sevy
相关产品推荐
相关产品推荐

