python - 使用 docker-compose 初始化 django 应用程序

标签 python django docker docker-compose

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

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

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

有什么方法可以告诉 docker-compose 只在它第一次运行时运行命令,或者在 django 中是否有任何替代方法来控制系统是否已经配置和更新?

为了澄清这里是我的 dockfile 和 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 已添加到我的 .gitignore 中,因为此文件用于存储当前应用程序版本。

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 同步的相同模型,并且我们有一个零时间配置环境,只需一个命令即可运行。

关于python - 使用 docker-compose 初始化 django 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37074346/

相关文章:

docker - Keycloak 无法在 Docker 撰写文件中工作。我该如何修复它?

bash - 超时执行持续时间而不是命令

python - 如何抓取受密码保护的网站

django - 如何使用 django 自定义表单保存多对多字段

MySQL更新更改多列是非原子的?

python - 尝试使用 mod_wsgi 运行 2 个具有不同 Python 版本的 Python 应用程序

amazon-web-services - 带有Docker和SQS的AWS Beanstalk上的Sinatra应用

python - 在 python 生成器理解中使用状态?

python - Django 1.6 - 密码更改/重置模板

python - 使用列及其值在 pandas 数据框中创建一个新列