Docker Compose中Django项目无法读取.dev.env环境变量求助
问题:Docker Compose指定的环境变量未加载到Django项目中
在Django项目中配置了docker-compose.yml,指定env_file为.dev.env,编写了对应Dockerfile,执行docker-compose build和docker-compose up -d启动项目后,在settings.py中通过load_dotenv()和os.environ查看环境变量,发现.dev.env中的ALLOWED_HOSTS、DEBUG等变量未被加载。
相关配置文件
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
./app目录下的Dockerfile
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}')
排查与解决方案
1. 先确认容器内是否存在目标环境变量
执行以下命令查看容器内的环境变量:
docker exec <容器名称或ID> env
如果输出中没有
ALLOWED_HOSTS、DEBUG等变量:
检查.dev.env文件是否和docker-compose.yml在同一目录下。docker-compose的env_file路径是相对执行docker-compose命令的当前目录的,若你在非docker-compose.yml所在目录执行命令,会导致路径找不到文件。如果输出中有这些变量:
问题出在Django的配置代码和.env文件格式上:- 无需调用
load_dotenv():docker-compose已经将.dev.env中的变量注入到容器的系统环境变量中,直接通过os.environ.get()读取即可。调用load_dotenv()会默认去加载容器内当前目录下的.env文件(而你的项目中没有这个文件),反而可能干扰环境变量的读取。修改settings.py代码如下:import os DEBUG = os.environ.get('DEBUG', False) == '1' ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '').split() SECRET_KEY = os.environ.get('SECRET_KEY') - 修正
.env文件格式:.dev.env中ALLOWED_HOSTS的单引号会被docker-compose当作值的一部分传递给容器,导致Django读取到的是带单引号的字符串,引发解析错误。修改为:ALLOWED_HOSTS=localhost 127.0.0.1 DEBUG=1 SECRET_KEY=django-insecure-...
- 无需调用
内容的提问来源于stack exchange,提问作者EvoluSpace
相关产品推荐
相关产品推荐

