Docker-compose (и django): Не удается получить переменные окружения для сервисов
Я пытаюсь написать небольшое решение для развертывания с помощью docker(-compose) для небольшого Django приложения.
В настоящее время файл django-compose с именем docker-compose.dev.yaml
выглядит примерно так:
version: "3"
services:
backend:
build:
context: ./backend
dockerfile: Dockerfile
command: python manage.py runserver 0.0.0.0:8000
ports:
- 8000:8000
env_file:
- dev.env
Файл dev.env
выглядит следующим образом:
DEBUG=1
SECRET_KEY=We9ZyuSKsP9Mgvsrt74gExF8baWbGL # not important that this leaks
DJANGO_ALLOWED_HOSTS=localhost
Однако, когда django пытается запуститься, я получаю следующее:
#11 0.634 ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS").split(" ")
#11 0.634 AttributeError: объект 'NoneType' не имеет атрибута 'split'
В основном, переменная окружения возвращает None
, то есть переменные не попадают в контейнер.
Я пытался, согласно документации, сделать следующее:
# ...
environment:
- DEBUG
- SECRET_KEY
- DJANGO_ALLOWED_HOSTS
Безрезультатно.
Есть идеи? Репозиторий за кодом является публичным, я приглашаю вас попробовать.
Моей текущей тестовой средой является рабочий стол Docker на Windows 10.
Итак, я понял это.
Оказалось, что эта строка в Dockerfile
для бэкенда:
RUN python manage.py migrate
Вот в чем была проблема. Я не понял, что он запускается во время сборки, а не во время выполнения, поэтому переменные окружения не были доступны.
Я перешел на скрипт, вызываемый во время выполнения, и не все работает!
backend/Dockerfile
:
# ...
# Make files executable
RUN chmod +x start.dev.sh
backend/start.dev.sh
:
#!/bin/bash
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
И ./docker-compose.dev.yaml
:
# ...
command: ./start.dev.sh
# ...