【问题标题】:.env variables not visible inside settings.py file of a Django project run with Docker.env 变量在使用 Docker 运行的 Django 项目的 settings.py 文件中不可见
【发布时间】:2020-08-10 08:22:45
【问题描述】:

我正在玩 Docker(暂时不使用 docker-compose)。 问题是我在.env文件中设置的变量对settings.py不可见,导致None在settings.py中被print(os.environ.get('TEST_VAR'))渲染。 如果我在 Dockerfile 中定义 TEST_VAR 变量,问题就会消失。 有人知道我在做什么错吗? 这是我的 Django 项目的样子:

项目布局:

my_project
   my_project
       settings.py
       .env
   manage.py
   requirements.txt
   Dockerfile

Dockerfile:

FROM python:3
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8


RUN mkdir /app
WORKDIR /app
ADD . /app/

RUN apt-get -y update
RUN apt-get install -y --fix-missing \
    libaio1 \
    git \
    wget \
    curl \
    pkg-config \
    python3-dev \
    software-properties-common \
    zip \
    && apt-get clean && rm -rf /tmp/* /var/tmp/*


RUN pip install --no-cache-dir -r requirements.txt

EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

.env

TEST_VAR='wow'

我运行的命令:

docker build -t simple-project .
docker run -it -p 8000:8000 simple-project

请注意,.env 与 settings.py 处于同一级别,但是我尝试将其上移一级,例如 manage.py 所在的位置。

【问题讨论】:

  • 你是如何设置.env的?只是放文件而不是暴露变量。
  • Em...我是部署、Docker 等方面的新手...您能澄清一下吗?
  • 最好使用 django-environ 吗? django-environ.readthedocs.io/en/latest

标签: django docker


【解决方案1】:

我会推荐你​​django-environ,在https://django-environ.readthedocs.io/en/latest/查看文档

通过pip install django-environ 安装后,在项目的根目录中创建.env 文件:

在/.env

SECRET_KEY="#b)oj5(wpt!1f1e8+%1sa4gcp*4b5#k^w=15gg80=_=3oavf3w"
DEBUG=on

然后在settings.py 中,您可以使用预定义的环境变量,例如

import os

# django-environ
# https://django-environ.readthedocs.io/en/latest/
import environ

from django.utils.translation import ugettext_lazy as _


# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Load and read .env file
# OS environment variables take precedence over variables from .env
env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env'))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env.bool('DEBUG', False)

[..]

【讨论】:

    【解决方案2】:

    Compose 将 automatically load environment variables from a .env file,但这是 Compose 的一项功能。普通的docker run 和其他启动容器的方式不会自动执行此操作。

    docker run 有一个等效的 --env-file 选项,您需要明确设置:

    docker run -it -p 8000:8000 \
      --env-file my_project/.env \
      simple-project
    

    【讨论】:

      【解决方案3】:

      假设您位于基本目录的.env 文件如下所示:

      # Database
      HOST=my_sql_server
      DB=my_db
      

      然后你想让这些成为你镜像的环境变量,在 Dockerfile 中包含这个RUN:

      RUN export $(grep -v '^#' .env | xargs)
      

      它的作用是取那些不以#开头的行(因为那些是cmets),然后设置环境变量。

      从您的 dockerfile 中,我没有看到您告诉 Docker 获取 .env 文件并设置环境的步骤,这可能是您缺少的。

      【讨论】:

      • RUN export ... 是无操作的:您以这种方式设置的任何变量都将在RUN 行的末尾丢失。你不能像这样在 Dockerfile 中动态设置环境变量。
      • 这就是大卫的重点,你的 docker 文件不应该包含你的秘密。使用export 在某些需要它们的过程中设置秘密,例如collectstatic 或migrate。在 Dockerfile 的末尾,RUN rm .env 以确保我们也从 Dockerfile 中删除 .env 文件。然后,机密信息应单独上传到主机。同样,不要将您的秘密(尤其是您的个人密码)存储在图像中(您团队中的许多其他人都可以访问)。
      猜你喜欢
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 2018-02-11
      • 2020-05-13
      • 2013-06-12
      • 2021-01-24
      相关资源
      最近更新 更多