我正在使用 docker
和 docker-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/