【问题标题】:Docker: How to make Supervisor exit when there's an errorDocker:出现错误时如何让主管退出
【发布时间】:2021-02-24 19:30:19
【问题描述】:

我有一个运行 Supervisor 的 Docker 容器,有 2 个进程:

  • 芹菜
  • 姜戈

当这些进程之一返回错误时,我希望 Supervisor 退出。

这是我的配置:

[supervisord]
nodaemon=true
loglevel=debug
logfile=/app/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/app

[program:django]
command=python manage.py runserver 0.0.0.0:8000 
redirect_stderr=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0


[program:celery]
command=celery -A myapp worker --beat --scheduler django --loglevel=debug
redirect_stderr=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0

[eventlistener:processes]
command=bash -c "printf 'SUPERVISORD READY' && while read line; do kill -SIGQUIT $PPID; done < /dev/stdin"
events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL

当我遇到一个通常应该让 Docker 退出的致命错误时,Supervisor 会一次又一次地尝试启动 Django.. 而目标是退出。

这里缺少什么? 我尝试了不同的其他配置,但它不起作用。

【问题讨论】:

标签: python django docker supervisord


【解决方案1】:

作为documented [autorestart]

默认:意外

如果出现意外,程序退出时进程会重新启动 退出代码不是与关联的退出代码之一 此进程的配置(参见退出代码)

【讨论】:

  • 你的意思是我应该设置“autorestart=false”吗?因为即使这样,进程也不会重新启动(没关系),但 Docker 不会退出(不好)。我的目标是在出现错误时退出 Docker。
  • supervisord 与运行 docker 容器无关,当主进程完成时 docker 容器退出通常写在 entrypoint.sh 中并且您的问题不提供 docker config,这与主管无关。从控制的角度来看,将 runserver 和 celery 放在同一个容器中也没有任何意义,也没有同时使用 supervisord 和 docker
猜你喜欢
  • 2012-08-14
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 2020-01-25
  • 2013-09-28
  • 1970-01-01
相关资源
最近更新 更多