当Gunicorn崩溃时如何重启Docker容器?
解决Docker Compose容器故障后自动重启的问题
嘿,这个场景太常见了!Docker Compose其实自带了重启策略配置,刚好能解决你的困扰,不用每次手动重建容器。
首先,你的docker-compose.yml里缺少了关键的restart配置项——默认情况下,容器退出后是不会自动重启的。你可以根据自己的需求选择以下几种重启策略:
restart: always:不管容器是正常退出还是故障崩溃,只要容器不在运行状态就会自动重启。不过如果你手动执行docker-compose stop停止容器,下次启动时才会重新运行它。restart: on-failure:max-retries:只有当容器以非零退出码(也就是故障崩溃)时才会重启,还可以指定最大重启次数,比如on-failure:5表示最多重启5次,适合你这种担心无限重启的场景。restart: unless-stopped:这是生产环境最常用的配置——除非你手动停止容器,否则无论是应用崩溃、Docker服务重启,容器都会自动恢复运行。
针对你的Flask+Gunicorn服务,我推荐用unless-stopped或者带次数限制的on-failure,修改后的配置如下:
version: "3" services: api: image: my-container:latest command: ["gunicorn", "--bind", "0.0.0.0:8000", "wsgi:app"] volumes: - ./api:/api restart: unless-stopped # 替换成你需要的重启策略
修改后执行docker-compose up -d重新启动服务,之后如果Gunicorn因为Flask应用故障退出,容器就会自动重启了。
另外,建议你同时排查下Flask应用崩溃的根源:可以用docker-compose logs -f api实时查看容器日志,找出导致非零退出的具体错误(比如未捕获的异常、资源耗尽等),从根本上解决问题,比单纯依赖重启策略更靠谱。
内容的提问来源于stack exchange,提问作者Jason Strimpel




