Вы были почти там.
Как Django находит свои настройки в проектах Divio
Ваше изменение на manage.py
разрешило collectstatic
, выполняемый Dockerfile:
RUN DJANGO_MODE=build python manage.py collectstatic --noinput
чтобы найти настройки правильно.По сути, вы жестко закодировали переменную окружения DJANGO_SETTINGS_MODULE
в manage.py
.
Это позволит любой команде manage.py
найти настройки, чтобы (как вы обнаружили) вы моглизапускать сайт локально.
Однако другие команды также должны знать, где находятся настройки, например, команда start web
, которая используется в облачных развертываниях, или локально, если вы запустить локальный сервер в оперативной конфигурации .
Эти команды основаны на правильно заданной переменной среды DJANGO_SETTINGS_MODULE
, которую можно установить локально в .env-local
, или для облачных серверов с помощью Переменные среды вид на панели управления.
Однако установленные таким образом переменные среды будут доступны только в том случае, если контейнеры запускаются из образа, для которого уже был построен .Они не будут доступны для команды collectstatic
, которая находится в Dockerfile, потому что на этом этапе образ строится .
Нелегко предоставлять одну и ту же информацию дважды, иособенно для жесткого кодирования переменной среды в модуле Python.
Лучшее решение
На самом деле вам не нужно делать или из этих вещей.Вместо того, чтобы вносить изменения в manage.py
и , настраивая переменную среды для каждой среды, добавьте:
ENV DJANGO_SETTINGS_MODULE=app.settings
в Dockerfile (перед выполнением любых команд Django).
Это сделает переменную доступной сразу же, а также запечетает ее в образ, так что каждый созданный из нее контейнер будет содержать эту переменную по умолчанию.
Переменные, установленные таким образом, все еще могут быть переопределены вна основе окружающей среды.