Docker构建镜像时错误加载Django production配置文件问题
Django Docker构建时加载错误配置文件问题
环境说明
我的Django应用配置文件存放在settings文件夹中,包含__init__.py、base.py、deployment.py和production.py文件。
wsgi.py内容
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp_settings.settings.production") application = get_wsgi_application()
Dockerfile内容
FROM python:3.8 ENV PYTHONUNBUFFERED 1 ENV PYTHONDONTWRITEBYTECODE 1 RUN mkdir /code COPY . /code/ WORKDIR /code RUN pip install --no-cache-dir git+https://github.com/ByteInternet/pip-install-privates.git@master#egg=pip-install-privates RUN pip install --upgrade pip RUN pip_install_privates --token {GITHUB-TOKEN} /code/requirements.txt RUN playwright install --with-deps chromium RUN playwright install-deps RUN touch /code/logs/celery.log RUN chmod +x /code/logs/celery.log EXPOSE 80
docker-compose.yml内容
version: '3' services: app: container_name: myapp_django_app build: context: ./backend dockerfile: Dockerfile restart: always command: gunicorn myapp_settings.wsgi:application --bind 0.0.0.0:80 networks: - myapp_default ports: - "80:80" env_file: - ./.env
问题
每次构建Docker镜像时,系统都会加载development.py配置文件而非production.py。在conda/venv环境下用set DJANGO_SETTINGS_MODULE=myapp_settings.settings.production能正常切换生产模式,但Docker构建时完全不识别production.py文件。
可能原因及解决方法
1. .env文件覆盖了环境变量
docker-compose配置中加载了.env文件,如果该文件内设置了DJANGO_SETTINGS_MODULE=myapp_settings.settings.development,会直接覆盖wsgi.py中的默认值。
- 解决方法:
- 打开
.env文件,将DJANGO_SETTINGS_MODULE的值修改为myapp_settings.settings.production; - 或者在docker-compose的
app服务中显式设置环境变量,强制覆盖.env内容:services: app: # ...其他配置 environment: - DJANGO_SETTINGS_MODULE=myapp_settings.settings.production
- 打开
2. Docker环境变量配置缺失
本地Windows的set命令在Linux容器中不生效,且构建镜像阶段与容器运行阶段的环境变量是分离的,仅靠wsgi.py的设置可能无法覆盖所有场景。
- 解决方法:在Dockerfile中添加环境变量配置,确保构建和运行阶段都能读取到生产环境配置:
FROM python:3.8 ENV PYTHONUNBUFFERED 1 ENV PYTHONDONTWRITEBYTECODE 1 ENV DJANGO_SETTINGS_MODULE=myapp_settings.settings.production # 新增该行 # ...后续命令不变
3. Settings包结构存在冲突
检查settings/__init__.py文件,如果里面有自动导入development配置的代码(比如from .development import *),会直接覆盖production的配置;另外要确保myapp_settings是合法的Python包(存在__init__.py文件)。
- 解决方法:
- 删除
settings/__init__.py中自动导入development的代码; - 确认目录结构为
myapp_settings/settings/,且各级目录都有__init__.py文件(空文件即可)。
- 删除
4. Gunicorn启动参数未明确指定配置
虽然wsgi.py设置了默认值,但如果Gunicorn启动时被其他隐式参数覆盖,也会加载错误配置。
- 解决方法:在docker-compose的启动命令中显式指定配置模块:
command: gunicorn --env DJANGO_SETTINGS_MODULE=myapp_settings.settings.production myapp_settings.wsgi:application --bind 0.0.0.0:80
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

