Where to run collectstatic when deploying django app to heroku using docker? Where to run collectstatic when deploying django app to heroku using docker? django django

Where to run collectstatic when deploying django app to heroku using docker?


After confirming with Heroku support, this does indeed appear to be a bit of a catch-22.

The solution was to put collectstatic in the Dockerfile so that it runs during build time and the files persist.

We got around not having a secret key config var by setting a default secret key using the get_random_secret_key function from Django.

The run phase uses the secret key from the Heroku config vars, so we aren't actually changing the secret key every time -- the default only applies to the build process. collectstatic doesn't index on the secret key, so this is fine.

In settings.py

from django.core.management.utils import get_random_secret_key...SECRET_KEY = os.getenv('DJANGO_SECRET_KEY', default=get_random_secret_key())


I don't use heroku so can't test, but you should be able to run collect static before you run the app;

Dockerfile

# Pull base imageFROM python:3.7-slim# Set environment variblesENV PYTHONDONTWRITEBYTECODE 1ENV PYTHONUNBUFFERED 1# Set work directoryWORKDIR /code/# Install dependenciesRUN pip install pipenvCOPY Pipfile Pipfile.lock .RUN pipenv install --system# Copy projectCOPY . .# Collect static filesRUN python manage.py collectstatic --noinput# run gunicornCMD gunicorn hello_django.wsgi:application --bind 0.0.0.0:$PORT

You could also not run collectstatic in your dockerfile, or event run the application because these can be ran by heroku.yml, for example;

build:  docker:    web: Dockerfile  config:    DJANGO_SETTINGS_MODULE: project.settingsrun:  web: gunicorn backend.config.wsgi:application --bind 0.0.0.0:$PORTrelease:  image: web  command:    - python manage.py collectstatic --noinput

You also shouldn't need to mkdir for your working directory. Just set WORKDIR /code/ early in your dockerfile and after that things will run based on that directory.

There's a decent article on this here; https://testdriven.io/blog/deploying-django-to-heroku-with-docker/