gunicorn icon indicating copy to clipboard operation
gunicorn copied to clipboard

--reload not working for docker

Open ArturHarutunyan opened this issue 1 year ago • 1 comments

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.

ArturHarutunyan avatar Dec 29 '23 10:12 ArturHarutunyan

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.

sylt avatar Feb 19 '24 23:02 sylt

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

pajod avatar Aug 07 '24 19:08 pajod