【发布时间】:2020-05-22 09:24:48
【问题描述】:
这是一个有趣的 stackover flow 问题,因为我有一个答案,但答案是几年前的。我找不到太多新的内容,但似乎它会很引人注目。
我正在使用 docker-compose 来启动一些容器。其中两个使用标准的 postgres 和 redis 图像。 其他的是 django 2.2.9(和 celery) 这是一个开发环境,我用 docker compose 启动它们,像这样:
command: ./manage.py runserver 0.0.0.0:80
docker-compose stop 发送一个 SIGINT。 redis 和 postgres 容器快速退出。 django 容器没有。 docker-compose stop 失去耐心并杀死他们。
(并且 pycharm 目前有无限的耐心,直到我强制它才会发送杀戮)。
这篇 2015 年关于 Django 1.9 (http://blog.lotech.org/fix-djangos-runserver-when-run-under-docker-or-pycharm.html) 的帖子说
"快速解决方法是专门监听 SIGINT 和 SIGTERM 当你得到它们时,你的 manage.py 和 sys.kill()。所以修改你的 manage.py 添加信号处理程序:"
它说明了如何。更改 manage.py 以捕获 SIGINT 的修复程序有效,并且它是少数几行,尽管它不适用于拥有自己的启动的 celery。 所以我可以继承我自己的 manage.py 版本并修复 celery,但这仍然是如何解决这个问题吗?
我看到 dockerfile 可以有
STOPSIGNAL SIGINT
但这并没有什么不同,我想是因为入口点是由 docker-compose 管理的。
【问题讨论】:
-
啊。在这里回答:stackoverflow.com/a/52046161/401226 有一个 docker-compose 相当于 STOPSIGNAL
-
附带说明,如果要投入生产,您不想在端口 80 上监听,因为这意味着以 root 身份运行,并且以 root 身份运行并不安全:pythonspeed.com/articles/root-capabilities-docker-security跨度>
-
在生产中我不使用 docker compose,它由主管运行,它在 nginx 代理到 gunicorn 的背后
标签: python django docker docker-compose