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-...'

My catalog in attached

Я запускаю проект с помощью команд: $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.

Вернуться на верх