3

My Django project that is created based on Cookiecutters is not updated in local development environment after I changed the source code, I need to stop and start the docker again. I checked the volume and it seems ok but still no auto-update. The files and their contents are as follow:

version: '3'

volumes:
  one_sell_local_postgres_data: {}
  one_sell_local_postgres_data_backups: {}

services:
  django: &django
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    image: one_sell_local_django
    container_name: one_sell_local_django
    platform: linux/x86_64
    depends_on:
      - postgres
      - redis
    volumes:
      - .:/app
    env_file:
      - ./.envs/.local/.django
      - ./.envs/.local/.postgres
    ports:
      - "8000:8000"
    command: /start

  postgres:
    build:
      context: .
      dockerfile: ./compose/production/postgres/Dockerfile
    image: one_sell_production_postgres
    container_name: one_sell_local_postgres
    volumes:
      - one_sell_local_postgres_data:/var/lib/postgresql/data:Z
      - one_sell_local_postgres_data_backups:/backups:z
    env_file:
      - ./.envs/.local/.postgres

  redis:
    image: redis:6
    container_name: one_sell_local_redis

The Dockerfile for Django:

ARG PYTHON_VERSION=3.9-slim-bullseye

# define an alias for the specfic python version used in this file.
FROM python:${PYTHON_VERSION} as python

# Python build stage
FROM python as python-build-stage

ARG BUILD_ENVIRONMENT=local

# Install apt packages
RUN apt-get update && apt-get install --no-install-recommends -y \
  # dependencies for building Python packages
  build-essential \
  && apt-get install gdal-bin -y \
  # psycopg2 dependencies
  libpq-dev

# Requirements are installed here to ensure they will be cached.
COPY ./requirements .

# Create Python Dependency and Sub-Dependency Wheels.
RUN pip wheel --wheel-dir /usr/src/app/wheels  \
  -r ${BUILD_ENVIRONMENT}.txt


# Python 'run' stage
FROM python as python-run-stage

ARG BUILD_ENVIRONMENT=local
ARG APP_HOME=/app

ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV BUILD_ENV ${BUILD_ENVIRONMENT}

WORKDIR ${APP_HOME}

# Install required system dependencies
RUN apt-get update && apt-get install --no-install-recommends -y \
  # psycopg2 dependencies
  libpq-dev \
  # Translations dependencies
  gettext \
  && apt-get install gdal-bin -y \
  # cleaning up unused files
  && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
  && rm -rf /var/lib/apt/lists/*

# All absolute dir copies ignore workdir instruction. All relative dir copies are wrt to the workdir instruction
# copy python dependency wheels from python-build-stage
COPY --from=python-build-stage /usr/src/app/wheels  /wheels/

# use wheels to install python dependencies
RUN pip install --no-cache-dir --no-index --find-links=/wheels/ /wheels/* \
    && rm -rf /wheels/

COPY ./compose/production/django/entrypoint /entrypoint
RUN sed -i 's/\r$//g' /entrypoint
RUN chmod +x /entrypoint

COPY ./compose/local/django/start /start
RUN sed -i 's/\r$//g' /start
RUN chmod +x /start


COPY ./compose/local/django/celery/worker/start /start-celeryworker
RUN sed -i 's/\r$//g' /start-celeryworker
RUN chmod +x /start-celeryworker

COPY ./compose/local/django/celery/beat/start /start-celerybeat
RUN sed -i 's/\r$//g' /start-celerybeat
RUN chmod +x /start-celerybeat

COPY ./compose/local/django/celery/flower/start /start-flower
RUN sed -i 's/\r$//g' /start-flower
RUN chmod +x /start-flower


# copy application code to WORKDIR
COPY . ${APP_HOME}

ENTRYPOINT ["/entrypoint"]

The entrypoint:

#!/bin/bash

set -o errexit
set -o pipefail
set -o nounset



# N.B. If only .env files supported variable expansion...
export CELERY_BROKER_URL="${REDIS_URL}"


# if [ -z "${POSTGRES_USER}" ]; then
#     base_postgres_image_default_user='postgres'
#     export POSTGRES_USER="${base_postgres_image_default_user}"
# fi
export DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
echo $DATABASE_URL
echo ${POSTGRES_DB}
postgres_ready() {
python << END
import sys

import psycopg2

try:
    psycopg2.connect(
        dbname="${POSTGRES_DB}",
        user="${POSTGRES_USER}",
        password="${POSTGRES_PASSWORD}",
        host="${POSTGRES_HOST}",
        port="${POSTGRES_PORT}",
    )
except psycopg2.OperationalError as e:
    print(e)
    sys.exit(-1)
sys.exit(0)

END
}
# TODO: here the postgres readiness should be checked
until postgres_ready; do
  >&2 echo 'Waiting for PostgreSQL to become available...'
  sleep 1
done
>&2 echo 'PostgreSQL is available'

exec "$@"
smrf
  • 349
  • 3
  • 16
  • 1
    I ran into the same issue (very similar setup). One of these two helped: 1. completely cleaning up docker, 2. in `compose/local/django/start` replacing `runserver_plus` with `runserver`. Good luck – Lis Dec 01 '22 at 21:37
  • What OS are you on? Did this happen recently and old projects are still working fine? – dacx Jan 01 '23 at 20:32
  • @dacx I have been using Mac OS since then, but the problem is just with this structure and not others. Besides, I think there are some deprecated and old libraries in the cookie cutters template for example we found that the JWT library is not the best one. – smrf Jan 02 '23 at 16:13
  • @dacx To me this happened on Ubuntu 22. Didn't check on any old projects, this one happened in a django project generated with cookiecutter late november 2022. – Lis Jan 16 '23 at 15:39

1 Answers1

1

It seems you have copied a lot of things from production docker setup to your local docker setup. I assume you have also copied the production/django/start file as well. You can revert it back to its original version because gunicorn does not reload the server when code is changed (unless you allow it). The original version of the code can be found in GitHub. Basically, it uses:

python manage.py runserver_plus 0.0.0.0:8000

Run server allows you to reload the server when there is a change in code. Apart from that, you do not need to copy everything from production to local settings. You can simply refer them in Dockerfile when copying in Docker image like this (unless there is a difference):

COPY ./compose/production/django/celery/worker/start /start-celeryworker
              ^^^^^^^^^^
RUN sed -i 's/\r$//g' /start-celeryworker
RUN chmod +x /start-celeryworker

COPY ./compose/production/django/celery/beat/start /start-celerybeat^
              ^^^^^^^^^^
RUN sed -i 's/\r$//g' /start-celerybeat
RUN chmod +x /start-celerybeat

COPY ./compose/production/django/celery/flower/start /start-flower
              ^^^^^^^^^^
RUN sed -i 's/\r$//g' /start-flower
RUN chmod +x /start-flower
ruddra
  • 50,746
  • 7
  • 78
  • 101
  • You mean we should replace the runserver_plus code & change the docker file accordingly? – smrf Dec 04 '22 at 05:52
  • 1
    you should use the original version of local/start file as mentioned in the github link – ruddra Dec 04 '22 at 14:10