Docer-compose.yml в проекте Django: переменные окружения не создаются из файла .env
Мой docker-compose.yml:
version: '3.8'
services:
web:
build: ./app
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- ./app/:/usr/src/app/
ports:
- 8000:8000
env_file:
- .dev.env
мой Dockerfile в ./app:
FROM kuralabs/python3-dev
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
Мой файл '.dev.env':
ALLOWED_HOSTS='localhost 127.0.0.1'
DEBUG=1
SECRET_KEY='django-insecure-...'
Я запускаю проект с помощью команд: $docker-compose build $docker-compose up -d
Я получаю переменные в settings.py:
load_dotenv()
print(f'Environment: {os.environ}')
мои переменные из файла '.dev.env' отсутствуют в списке переменных окружения.
Пожалуйста, помогите мне понять, почему переменные '.dev.env' не попадают в среду?
Вы можете использовать переменные окружения из файла .env, назначив их своему сервису, возьмем следующий пример
version: '3.9'
services:
something:
image: someimage
container_name: comecontainer
environment:
- MARIADB_ROOT_USER
- MARIADB_ROOT_PASSWORD
- MARIADB_DATABASE
Переменные окружения напрямую считываются из файла .env
, расположенного рядом с docker-compose.yaml. Обратите внимание, что env_file
работает точно так же. Поэтому вместо чтения из файла .env
вы можете использовать env_file
для адресации (в вашем случае)
файл .dev.env
.
Надеюсь, это поможет.
Кроме того, возможно, вы могли бы назначить путь load_dotenv
.
from dotenv import load_dotenv
from pathlib import Path, PurePosixPath
dotenv_path = PurePosixPath(Path(__file__).resolve().parent.parent, '.dev.env').as_posix()
load_dotenv(dotenv_path=dotenv_path)
Это также должно работать, если поместить его где-нибудь после импорта в manage.py
.