Я развертываю приложение Django в Heroku, используя Docker. Когда я помещаю RUN manage.py collectstatic --noinput
в Dockerfile, он терпит неудачу, потому что для переменной среды DJANGO_SECRET_KEY
не задано значение. Насколько я понимаю, это потому, что конфигурационные переменные недоступны во время сборки.
Когда я запускаю collectstati c в качестве команды выпуска, она работает без ошибок и успешно копирует файлы stati c. Однако, когда я нажимаю URL-адрес приложения, он возвращает ошибку 500, потому что не удается найти файлы stati c. Я полагаю, что это потому, что команда release запускается как динамо в эфемерной файловой системе, и поэтому скопированные файлы не найдены.
Кажется, что это catch-22. Поместить collectstati c в Dockerfile не удается, потому что нет доступных переменных конфигурации, но поместить его в качестве команды выпуска не удается, поскольку сохраняются только изменения файла на этапе сборки?
Что делать?
Вот мои настройки c настроек в settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
...
]
...
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
STATICFILES_STORAGE = 'backend.storage.WhiteNoiseStaticFilesStorage'
Dockerfile
# Pull base image
FROM python:3.7-slim
# Set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Set work directory
RUN mkdir /code
WORKDIR /code
# Install dependencies
RUN pip install pipenv
COPY Pipfile Pipfile.lock /code/
RUN pipenv install --system
# Copy project
COPY . /code/
## collect static files
RUN mkdir backend/staticfiles
# This fails because DJANGO_SECRET_KEY can't be empty
RUN python manage.py --noinput
heroku.yml
build:
docker:
web: Dockerfile
run:
web: gunicorn backend.config.wsgi:application --bind 0.0.0.0:$PORT