You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:10:48