python - Docker:优雅地停止 django 服务器

标签 python django docker

我正在使用 dockerdocker-compose。 在 docker-compose.yml 我有启动 django 服务器的命令:

command: ["./run/web.sh"]

在 json 格式中,命令应该以 exec 模式运行。在 web.sh 中:

#!/usr/bin/env bash
exec python manage.py runserver

当我尝试使用 docker-compose stop 停止服务时,它等待了 10 秒(默认超时),然后就终止了服务。在日志中,我发现 project_web_1 已退出,代码为 137

如何使用docker stop优雅地停止django runserver?

最佳答案

在您的 docker-compose.yml 文件中,将 stop_signal 设置为 SIGINT:

django:
  build: .
  command: ["./run/web.sh"]
  stop_signal: SIGINT

我自己为此苦苦挣扎了一段时间......

启动运行服务器时,您会注意到它显示“使用 CONTROL-C 退出服务器”。我认为这意味着 Django 的运行服务器被编写为处理 SIGINT (ctrl-c) 而不是 SIGTERM(docker 发送的信号)。对我来说,更改 Docker 发送给 Django 的信号比尝试在我的脚本中处理 SIGTERM 并优雅地退出 runserver 更容易。

请注意,这取决于在您的 web.sh 脚本中使用 exec,这样信号就不会被 shell 吃掉——但我知道您已经这样做。

关于python - Docker:优雅地停止 django 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51195840/

相关文章:

docker - sockjs-node路径被webpack-dev-server baseUrl覆盖

python - 使用 Displacy (Python) 可视化依赖解析

python-cloudant 查询错误

python - 名称错误 : name 'random' is not defined

python - django - 如何实现两步发布机制

自定义用户模型中的 django 1.6 身份验证

docker - docker 注册表:https而不是http

python - 如何在Python中中断socket.recv()?

python - Django 查询集优化 - 防止选择带注释的字段

docker - 动态 Docker 基础镜像