gunicorn
gunicorn copied to clipboard
--reload not working for docker
I have a Docker setup running Gunicorn with Uvicorn workers. It's configured to reload on file changes. However, it starts reloading when settings.py is modified but never completes the process.
Docker Configuration:
actions:
restart: always
build:
context: ./services/actions
shm_size: '512mb'
shm_size: '512mb'
ports:
- 8082:8080
volumes:
- ./services/actions/logs:/app/logs
- ./services/actions/src:/app/src
- ./services/actions/api.py:/app/api.py
env_file:
- .env
- .local.env
command: gunicorn api:app --workers $ACTION_WORKERS_COUNT --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:$ACTION_PORT --timeout 600 --log-level debug --max-requests 0 --reload --reload-engine=inotify
Logs
[2023-12-29 10:51:56 +0000] [424] [INFO] Worker reloading: settings.py modified
[2023-12-29 10:51:56 +0000] [422] [INFO] Worker reloading: settings.py modified
[2023-12-29 10:51:56 +0000] [423] [INFO] Worker reloading: settings.py modified
[2023-12-29 10:51:56 +0000] [421] [INFO] Worker reloading: settings.py modified
Any insights on why the reloading process isn't completing would be greatly appreciated.
Seems to be tied to the UvicornWorker worker class, as e.g. sync seems to work fine. The following patch would fix it for uvicorn workers though:
diff --git a/gunicorn/workers/base.py b/gunicorn/workers/base.py
index f97d923c..348d27cc 100644
--- a/gunicorn/workers/base.py
+++ b/gunicorn/workers/base.py
@@ -125,7 +125,8 @@ class Worker(object):
os.write(self.PIPE[1], b"1")
self.cfg.worker_int(self)
time.sleep(0.1)
- sys.exit(0)
+ import _thread
+ _thread.interrupt_main()
reloader_cls = reloader_engines[self.cfg.reload_engine]
self.reloader = reloader_cls(extra_files=self.cfg.reload_extra_files,
... but some more investigation as to exactly why it happens would probably be good before submitting any PR.
uvicorn is deprecating shipping such worker: https://github.com/encode/uvicorn/commit/772c24bd1940fa81ad5f670c46f7d98615079838 and the suggested replacement has the related open issue: https://github.com/Kludex/uvicorn-worker/issues/7