Django 检查并替换 Docker Compose 文件:未设置调试标志?

big*_*ner 1 python django docker docker-compose

我正在尝试为生产准备 Django 应用程序。我创建了一个备用 docker-compose YML 文件,其中指定 DEBUG=0。但是,当我运行 django 检查部署时,它说 DEBUG 设置为 True。

对我哪里出错有什么想法吗?我认为这是我使用 Docker 的问题。但这可能是我使用 Django 的方式有问题吗?

这是我的步骤:

  1. 使用 docker-compose.yml 创建我的项目(见下文)
  2. 创建用于生产的 docker-compose-prod.yml (见下文)
  3. 跑了以下
$ docker-compose down
$ docker-compose -f docker-compose-prod.yml up -d --build
$ docker-compose exec web python manage.py check --deploy
Run Code Online (Sandbox Code Playgroud)
  1. 支票输出: ?: (security.W018) You should not have DEBUG set to True in deployment.

迄今为止的一些调查步骤:

A.检查环境变量。

$ docker-compose exec web python
>>> import os
>>> os.environ.get('DEBUG')
'0'
Run Code Online (Sandbox Code Playgroud)

B. 尝试以不同方式重建 docker 镜像,例如使用 --no-cache 标志

C. 在条件代码块中的settings.py 中设置DEBUG 标志(而不是使用os.environ.get)。这似乎有效。但我不明白为什么?代码详情如下。

代码摘录

  1. 摘自 docker-compose.yml
services:
  web:
    ...
    environment:
      - ENVIRONMENT=development
      - SECRET_KEY=randomlongseriesofchars
      - DEBUG=1
Run Code Online (Sandbox Code Playgroud)
  1. 摘自 docker-compose-prod.yml
services:
  web:
    ...
    environment:
      - ENVIRONMENT=production
      - SECRET_KEY=anotherrandomlongseriesofchars
      - DEBUG=0
Run Code Online (Sandbox Code Playgroud)
  1. 摘自settings.py
ENVIRONMENT = os.environ.get('ENVIRONMENT', default='production') 
SECRET_KEY = os.environ.get('SECRET_KEY')
DEBUG = os.environ.get('DEBUG', default=0)  #How is DEBUG being set to True?
...
if ENVIRONMENT == 'production':
    [Various settings for production]
    [Putting DEBUG=0 in this conditional block works]
Run Code Online (Sandbox Code Playgroud)

Ole*_*kin 5

环境变量是字符串,因此结果os.environ.get()是字符串。

如果代码首先期望变量为 int、boolean 等(而不是字符串),则可能会失败。或者,尝试转换为所需的类型,这可能与所需的结果不同。

即,如果转换为布尔值,则只有空字符串才会产生False.

因此,可能的选择是:

  • 添加逻辑以首先读取环境变量,然后将它们正确地转换或解析为目标参数。
  • 使用 env 助手,例如django-environ环境允许将环境变量自动转换为 taget 类型并提供有用的实用方法,通常提供您可能在选项 1 中自己实现的东西
  • 使用不同的模式来传递参数 - 即不是通过环境变量,而是通过自定义设置文件(也存在相应的帮助程序)。有人喜欢环境变量,有人喜欢文件,这也可能取决于项目/团队/您的部署方式(仪器支持什么)。