使用 docker-compose 初始化 Django 应用程序

Init django app with docker-compose

我是 docker-compose 的新手,我有一个 docker 我的 django 实例和一个 mysql 数据库。我想创建一个自动配置的容器,其中 运行 仅在第一个 docker 运行 上执行命令。在此命令中,我想执行以下任务:

  1. 进行初始数据库迁移
  2. 创建管理员超级用户
  3. 将 mysql 备份导入数据库

此后系统应继续启动 django 测试网络服务器。

有什么方法可以告诉 docker-compose 到 运行 一个命令就在上面 运行 或者 django 中是否有任何替代方法来控制系统是否已经配置并更新了?

为了澄清这里是我的码头文件和 docker-compose.yml:

FROM python:3.4
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

####################

version: '2'
services:
db:
   image: "mysql:5.6"
   ports:
     - 3306:3306
   environment:
     MYSQL_ROOT_PASSWORD: xxxxxx
     MYSQL_DATABASE: xxxxxx
     MYSQL_USER: xxxxx
     MYSQL_PASSWORD: xxxxxxx
 web:
   build: .
   command: python manage.py runserver 0.0.0.0:8000
   volumes:
     - .:/code
   ports:
     - "8000:8000"
   depends_on:
     - db

谢谢。

根据@cricket_007的评论,我终于找到了解决问题的棘手方法。我已经为数据库服务和我的 Web 服务创建了一个 sh 脚本。此外,我在我的文件夹中创建了两个版本文件,web_local.version 和 web_server.version。

web_local.version已添加到我的.git忽略,因为此文件用于存储当前应用程序版本。

start_web.sh 脚本是一个简单的脚本,用于比较文件夹是否包含 web_local.version 文件。在这种情况下,项目已在过去配置,脚本会检查当前应用程序版本与服务器版本相比是否更新。如果一切都是最新的,只需 运行 一个网络服务器,否则 运行 迁移以更新模型,然后 运行 网络服务器。

这里是web_start.sh参考脚本:

#!/bin/bash

FILE="web_local.version"

if [ -f "$FILE" ];
then
   echo "File $FILE exist."
   if diff ./web_server.version ./web_local.version > /dev/null;
   then
      echo "model version up to date :)"
   else
      echo "model updated!!"
      python manage.py migrate
      cp ./web_server.version ./$FILE
  fi
else
  echo "File $FILE does not exist"
  sleep 10 #added because the first time db take a long time to init and the script doesn't wait until db is finished
  cp ./web_server.version ./$FILE
  python manage.py migrate
fi
python manage.py runserver 0.0.0.0:8000

我想还有更正式的解决方案,但这个解决方案对我的案例有用,因为它允许我们的团队维护相同的模拟数据库和通过 git 同步的相同模型,并且我们有一个零时间配置环境运行宁只用一个命令。