Docker 环境变量和 Django 数据库设置

bix*_*e57 6 django environment-variables docker

我正在运行一个内部有 Django 的 Docker 容器。

这是我的 dev.yml 文件:

version: '2'

volumes:
  postgres_data_dev: {}
  postgres_backup_dev: {}

services:
  postgres:
    build: ./compose/postgres
    volumes:
      - postgres_data_dev:/var/lib/postgresql/data
      - postgres_backup_dev:/backups
    environment:
      - POSTGRES_USER=sorbetcitron

  django:
    build:
      context: .
      dockerfile: ./compose/django/Dockerfile-dev
    command: python ./manage.py runserver_plus 0.0.0.0:8000
    depends_on:
      - postgres
    environment:
      - POSTGRES_USER=sorbetcitron
      - USE_DOCKER=yes
      - DJANGO_DEBUG=True
      - DATABASE_URL=postgres://django:django@localhost:5432/sorbetcitron
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    links:
      - postgres



  pycharm:
    build:
      context: .
      dockerfile: ./compose/django/Dockerfile-dev
    depends_on:
      - postgres
    environment:
      - POSTGRES_USER=sorbetcitron
    volumes:
      - .:/app
    links:
      - postgres
Run Code Online (Sandbox Code Playgroud)

然后我用以下命令启动我的容器:

docker-compose -f dev.yml up
Run Code Online (Sandbox Code Playgroud)

但是当我执行以下操作时,我没有设置环境变量:

docker-compose -f dev.yml run django echo $DATABASE_URL
Run Code Online (Sandbox Code Playgroud)

我只想测试容器中的数据库与本地计算机中的另一个数据库之间的简单切换。

Edit#1 我的变量已有效设置,因为 docker-compose 配置返回:

services:
  django:
    build:
      context: /Users/vincentle/dev/sorbetcitron
      dockerfile: ./compose/django/Dockerfile
    command: /gunicorn.sh
    depends_on:
    - postgres
    - redis
    environment:
      DATABASE_URL: postgres://django:django@localhost:5432/sorbetcitron
      DJANGO_ACCOUNT_ALLOW_REGISTRATION: 'True'
      DJANGO_ADMIN_URL: ''
      DJANGO_ALLOWED_HOSTS: .sorbetcitron.com
      DJANGO_AWS_ACCESS_KEY_ID: ''
      DJANGO_AWS_SECRET_ACCESS_KEY: ''
      DJANGO_AWS_STORAGE_BUCKET_NAME: ''
      DJANGO_MAILGUN_API_KEY: ''
      DJANGO_SECRET_KEY: s+s6-^@s&=xg@l7!qsprhd5-1-0*wuh*0tjm_5)%uq(5q(nc4c
      DJANGO_SECURE_SSL_REDIRECT: 'False'
      DJANGO_SENTRY_DSN: ''
      DJANGO_SERVER_EMAIL: ''
      DJANGO_SETTINGS_MODULE: config.settings.production
      POSTGRES_PASSWORD: mysecretpass
      POSTGRES_USER: postgresuser
    user: django
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么我的 Django 没有考虑这个变量(我可以使用存储在 docker 的 postgres 数据库中的数据)

我的 config.py 文件:

DATABASES = {
    # Raises ImproperlyConfigured exception if DATABASE_URL not in os.environ
    'default': env.db('DATABASE_URL', default='postgres:///sorbetcitron'),
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*lza 6

使用:

env.db('DATABASE_URL', default='postgres:///sorbetcitron')
Run Code Online (Sandbox Code Playgroud)

意味着您正在使用 django-environ 包来设置环境变量,在这种情况下,您需要一个包含所有使用的变量的 .env 文件。如果您没有使用这个包,这就是为什么没有在 django 设置上加载的原因。在这种情况下你应该使用:

import os
os.getenv('DATABASE_URL')
Run Code Online (Sandbox Code Playgroud)

或者

import os
os.environ.get('DATABASE_URL')
Run Code Online (Sandbox Code Playgroud)


opH*_*AME 1

我不是 Python 专家,但你读取环境变量的代码对我来说看起来是错误的。

请尝试:

import os
DB_URL = os.getenv('DATABASE_URL')
Run Code Online (Sandbox Code Playgroud)

  • @ArdiNusawan 是的,这也可以,但是 getenv (甚至 `os.environ.get('DATABASE_URL')` 效果更好,因为如果未设置 `DATABASE_URL` ,它将返回 `none` 。其中 `os.environ['如果未设置,DATABASE_URL']` 将返回 KeyError。 (2认同)