Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Docker:优雅地停止django服务器_Python_Django_Docker - Fatal编程技术网

Python Docker:优雅地停止django服务器

Python Docker:优雅地停止django服务器,python,django,docker,Python,Django,Docker,我正在使用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\u

我正在使用
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\u web\u 1已退出,代码为137


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

我将在这里保留适合我的配置:

yml文件:

backend:
restart: always
container_name: django_proj
image: username/django_proj
build:
  context: .
  dockerfile: ./docker/django/Dockerfile
command: /code/gunicorn-entrypoint.sh
expose:
  - 8000
gunicorn-entrypoint.sh与您的sh相同:

#!/bin/sh
sleep 10

python manage.py makemigrations

python manage.py migrate

gunicorn -c gunicorn-config.py app_name.wsgi:application

docker compose.yml
文件中,将
stop\u信号设置为
SIGINT

django:
生成:。
命令:[“/run/web.sh”]
停止信号:SIGINT

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

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


请注意,这取决于在
web.sh
脚本中使用
exec
,以使信号不会被shell吃掉,但我看到您已经在这样做了

你有没有试过不带exec?例:#/bin/sh python manage.py runserverw/o
exec
命令将在单独的上下文中运行,docker将无法找到命令并发送SIGTERM。任何其他命令都可以很好地工作,但不是
django runserver
这个命令怎么样
ps aux | grep runserver | awk'{print$2}'| xargs sudo kill
我知道如何手动终止命令,但不知道如何让docker终止它生成页面并终止python本身,就像我告诉过你的任何其他命令都可以正常工作一样。包括古尼康。只有
/manage.py runserver
不想优雅地停止。最后!我从没想过django只听SIGINT。