Benny Chan
Benny Chan

Reputation: 928

How can I reload python code in dockerized django?

I am using docker-compose to run 3 containers: django + gunicorn, nginx, and postgresQL.

Every time I change my python .py code, I will run docker-compose restart web but it takes a long time to restart. I try to restart gunicorn with

`docker-compose exec web ps aux |grep gunicorn | awk '{ print $2 }' |xargs kill -HUP`

But it didn't work.

How can I reload .py code in a shorter time?

I know that gunicorn can be set to hot reload python code. Can I do it manually with a command?

My docker-compose.yml:

version: '3'

services:
  db:
    build: ./db/
    volumes:
      - dbdata:/var/lib/postgresql/data/
    environment:
      - POSTGRES_DB
      - POSTGRES_USER
      - POSTGRES_PASSWORD
  web:
    build: .
    command: >
      sh -c "gunicorn abc.wsgi -b 0.0.0.0:8000"
    # sh -c "python manage.py collectstatic --noinput &&
    #        python manage.py loaddata app/fixtures/masterData.json &&
    #        gunicorn abc.wsgi -b 0.0.0.0:8000"
    volumes:
      - .:/var/www/django
      - ./static:/static/
    expose:
      - "8000"
    environment:
      - USE_S3
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_STORAGE_BUCKET_NAME
      - POSTGRES_DB
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_HOST
      - SENDGRID_API_KEY
      - SECRET_KEY
    depends_on:
      - db
  nginx:
    restart: always
    build: ./nginx/
    volumes:
      - ./static:/static/
    ports:
      - "8000:80"
    links:
      - web
  backup:
    image: prodrigestivill/postgres-backup-local:11-alpine
    restart: always
    volumes:
      - /var/opt/pgbackups:/backups
    links:
      - db
    depends_on:
      - db
    environment:
      - POSTGRES_HOST
      - POSTGRES_DB
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - SCHEDULE
      - BACKUP_KEEP_DAYS
      - BACKUP_KEEP_WEEKS
      - BACKUP_KEEP_MONTHS
      - HEALTHCHECK_PORT

volumes:
  dbdata:

Dockerfile - web:

FROM python:3.7-slim
ENV PYTHONUNBUFFERED 1
ENV WKHTML2PDF_VERSION 0.12.4
# 0.12.5 wget not work
ENV TERM linux
ENV DEBIAN_FRONTEND noninteractive
RUN mkdir /var/www
RUN mkdir /var/www/django
WORKDIR /var/www/django
ADD requirements.txt /var/www/django/
RUN apt-get update && apt-get install -y \
    libpq-dev \
    python-dev \
    gcc \
    openssl \
    build-essential \
    xorg \
    libssl1.0-dev \
    wget
RUN apt-get install -y sudo
RUN pip install --upgrade pip
RUN pip install -r requirements.txt && pip3 install requests && pip3 install pdfkit
# & pip3 install sendgrid-django
ADD . /var/www/django/
WORKDIR /var/www
RUN wget "https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTML2PDF_VERSION}/wkhtmltox-${WKHTML2PDF_VERSION}_linux-generic-amd64.tar.xz"
RUN tar -xJf "wkhtmltox-${WKHTML2PDF_VERSION}_linux-generic-amd64.tar.xz"
WORKDIR wkhtmltox
RUN sudo chown root:root bin/wkhtmltopdf
RUN sudo cp -r * /usr/
WORKDIR /var/www/django

Dockerfile - nginx:

FROM nginx

# Copy configuration files to the container
COPY default.conf /etc/nginx/conf.d/default.conf

Upvotes: 0

Views: 3552

Answers (1)

Benny Chan
Benny Chan

Reputation: 928

After a while, I found that this line is having a problem: gunicorn abc.wsgi -b 0.0.0.0:8000

This line will put gunicorn running a subprocess. When I tried to submit a HUP signal to gunicorn, only the master process can receive the signal. So gunicorn was not killed. The code cannot be reloaded.

What I do is adding "exec" before it and Gunicorn will be run as the master process. And I can use "docker-compose kill -s HUP web" to gracefully restart gunicorn and my code will be reloaded in the container

Upvotes: 2

Related Questions