docker 的 django-environ 和 Postgres 环境

问题描述 投票:0回答:3

我正在为我的 Django 项目使用

django-environ
包。 我在
.env
文件中提供了数据库 URL,如下所示:
DATABASE_URL=psql://dbuser:dbpassword@dbhost:dbport/dbname

我的数据库设置在

settings.py
:

DATABASES = {
    "default": env.db(),
}

到目前为止,我没有任何问题。

然后,我创建了一个

docker-compose.yml
,其中指定我的项目使用 Postgres 数据库,即:

version: '3.8'

services:
  ...
    db
      image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=???
      - POSTGRES_PASSWORD=???
      - POSTGRES_DB=???
      - "POSTGRES_HOST_AUTH_METHOD=trust"

现在我有点困惑。

我如何提供这些

POSTGRES_*
环境。变量在那里?我是否需要将它们作为单独的变量与我的
DATABASE_URL
文件中的
.env
一起提供?如果是,实现此目标的最佳方法是什么?我的目标是避免设置重复。

django docker docker-compose environment-variables django-environ
3个回答
1
投票

您可以在

.env
文件中使用变量扩展。类似的东西

DB_NAME=dbname
DB_USER=dbuser
DB_PASSWORD=dbpassword
DATABASE_URL=psql://$DB_USER:$DB_PASSWORD@dbhost:dbport/$DB_NAME

然后在你的撰写文件中添加类似的内容

services:
  postgresdb:
    container_name: projectname_db
    image: postgres:15
    environment:
      POSTGRES_DB: ${DB_NAME}
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    ports:
      - "127.0.0.1:5432:5432"
...

我不太熟悉 django-environ 但这应该可行


0
投票

显然,

django-environ
不支持变量扩展(从v0.10.0开始),所以我发现的方法是拼写出各个选项,而不是使用
env.db()

Django 设置

DATABASES = {
  "default": {
     # ...
     "NAME": env("DB_NAME"),
     "USER": env("DB_USER"),
     "PASSWORD": env("DB_PASSWORD"),
  },
}

Docker 组合

version: '3.8'

services:
  # ...
  db:
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=${DB_NAME}


0
投票

您只需要在 docker-compose 文件的 Django 容器块中引用您的 .env 文件。这是 Django 设置文件可以使用

os.environ.get()
访问它们的地方。 docker-compose 文件中
environment
属性中的环境变量不会从 .env 文件中插入。仅当在运行 compose 文件的 shell 中导出变量时,它们才会在那里进行插值。它帮助我在遇到同样的问题时查看这些文档:Docker Compose 中的环境变量优先级

Django 设置:

import os
    
    DATABASES = {
        'default': {
           # ...

            "POSTGRES_DB": os.environ.get("DB_NAME"),
            "POSTGRES_USER": os.environ.get("DB_USER"),
            "POSTGRES_PASSWORD": os.environ.get("DB_PASSWORD")

           # ...
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.