【问题标题】:Set up db_password for django and postgres in docker在 docker 中为 django 和 postgres 设置 db_password
【发布时间】:2020-10-27 09:54:59
【问题描述】:

我有一个带有 django 3.1 和 postgresql 的 docker 映像。

在 docker-compose.yml 我写道:

version: '3'

services:
  app:
   build:
     context: .
   ports:
     - "8001:8001"
   volumes:
     - ./app:/app
   command: >
     sh -c "python manage.py runserver 0.0.0.0:8001"
   environment:
     - DB_HOST=db
     - DB_NAME=app
     - DB_USER=postgres
     - DB_PASS=password

   depends_on:
     - db

  db:
    image: postgres:10-alpine
    environment:
      - POSTGRES_DB=app
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password

在 Django 应用程序的 settings.py 中,我从 .git 中排除的 .txt 文件中读取数据库密码

...

DB_PASSWORD = ''
with open('database_password.txt') as f:
    DB_PASSWORD = f.read().strip()

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': os.environ.get('DB_HOST'),
        'NAME': os.environ.get('DB_NAME'),
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': DB_PASSWORD,
    }
}
...

让 Django 和 Docker 从同一个地方安全读取同一个密码的最佳实践是什么?

我在这里找到的最合适的信息: https://medium.com/swlh/setting-up-a-secure-django-project-repository-with-docker-and-django-environ-4af72ce037f0

作者提议使用 django 的 django-environ 包。这篇文章中的docker部分是这样描述的:

如果您在上面的 .env 文件中的 DATABASE_URL 变量中指定了不同的用户和密码,您应该在此处包含它们(尽管这会损害数据库的安全性,因为 docker-compose.yml 文件将被提交到存储库)。在部署项目时,请创建一个不会提交的单独 docker-compose 文件。

这对我来说不是很清楚。

【问题讨论】:

    标签: django postgresql docker security


    【解决方案1】:

    我使用几乎相同的解决方案,但将环境变量放在单独的文件 db.env 中,该文件位于 .gitignore 中,并且只能由 root 读取。

    关键在 docker-compose env_file 驱动中。

    现在docker-compose.yml 看起来像:

    version: '3'
    
    services:
      app:
       build:
         context: .
       ports:
         - "8001:8001"
       volumes:
         - ./app:/app
       env_file:
          - db.env
       command: >
         sh -c "python manage.py runserver 0.0.0.0:8001"
       depends_on:
         - db
    
      db:
        image: postgres:10-alpine
      env_file:
          - db.env
    

    在db.env:

    DB_HOST=db
    DB_NAME=app
    DB_USER=postgres
    DB_PASS=password
    

    终于在 Django settings.py

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'HOST': os.environ.get('DB_HOST', 'localhost'),
            'NAME': os.environ.get('DB_NAME'),
            'USER': os.environ.get('DB_USER'),
            'PASSWORD': os.environ.get('DB_PASSWORD'),
        }
    }
    

    这解决了将私人信息排除在 GIT 之外的问题,但您需要找到一种解决方案以另一种方式部署 .env 文件,并确保这些文件不会依次泄漏。对于简单的单主机设置,这可以手动完成。

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 2016-04-11
      • 2018-10-18
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2021-07-09
      相关资源
      最近更新 更多