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