在Django项目中的docer-compose.yml文件中:环境变量未从.env文件中创建
在Django项目中的docer-compose.yml文件中:环境变量未从.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
中的变量没有进入环境。
问题出现的原因是在Docker Compose中使用环境变量时,无法从.env文件中创建环境变量。解决方法有两种:
1. 使用.env文件中的环境变量直接赋值给服务:
version: '3.9' services: something: image: someimage container_name: comecontainer environment: - MARIADB_ROOT_USER - MARIADB_ROOT_PASSWORD - MARIADB_DATABASE
在这种情况下,环境变量将直接从与docker-compose.yaml文件相同的目录下的.env文件中读取。
2. 使用env_file指定.env文件的路径:
version: '3.9'
services:
something:
image: someimage
container_name: comecontainer
env_file:
- .dev.env
在这种情况下,可以使用env_file指定.env文件的路径,例如使用.dev.env文件。
另外,还可以在Django项目的manage.py文件中使用load_dotenv函数来指定.env文件的路径:
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)
如果以上方法仍然无法解决问题,可以尝试以下两种方法:
1. 将Docker Compose的版本升级到3.9,并确保在存放.env文件的文件夹位置执行docker-compose up --build命令。
2. 参考stackoverflow上的解决方法,通过在Dockerfile中添加RUN echo ENV命令来检查环境变量是否被正确设置。