django 在 docker 中自动化部署的问题

django 官方教程中数据表和初始管理员的创建都是在控制台中进行的:

python manage.py migrate
python manage.py createsuperuser

其中管理员创建过程还需要跟用户进行交互。

如果应用是直接部署在服务器的 python 环境中是没有问题的,但是如果使用 docker 环境进行自动化部署就会出现之前我们遇到的问题:在生产环境上部署之后没办法自动进行数据表和管理员的创建(假如每次都登录到 docker shell 中进行操作就失去了自动化的意义)。

后来的解决方案是通过用户的初始请求使用代码来进行表和用户的创建:

首先创建一个独立的 view 处理初始化请求:

import os
from django.core.management import execute_from_command_line
from django.contrib.auth.models import User
from django.db import connection
from django.http import HttpResponse

def init(request):
    try:
        # 如果已经执行过初始化则退出
        if check_table_exists('auth_user'):
            has_user = User.objects.count() > 0
            if has_user:
                raise Exception('already installed')

        # migrate
        migrate(request)

        # create super user
        create_superuser(request)
        return HttpResponse('install successfully !')
    except Exception as e:
        return HttpResponse('install failed:' + str(e))

def migrate(request):
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "partner.settings")
    execute_from_command_line(['manage.py', 'migrate'])
    return HttpResponse('migrated successfully !')

def create_superuser(request):
    name = request.GET.get('name')
    pwd = request.GET.get('pwd')
    email = request.GET.get('email')
    User.objects.create_superuser(username=name, email=email, password=pwd)

def check_table_exists(table_name):
    return table_name in connection.introspection.table_names()

然后配置路由:

path('/install', install.init)

最后通过访问部署环境的 url 即可进行默认安装:

wget http://{host}:{port}/install?name={admin-name}&email={your-email}&pwd={admin-password}