使用 docker-compose 初始化 Django 应用程序
Init django app with docker-compose
我是 docker-compose 的新手,我有一个 docker 我的 django 实例和一个 mysql 数据库。我想创建一个自动配置的容器,其中 运行 仅在第一个 docker 运行 上执行命令。在此命令中,我想执行以下任务:
- 进行初始数据库迁移
- 创建管理员超级用户
- 将 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 同步的相同模型,并且我们有一个零时间配置环境运行宁只用一个命令。
我是 docker-compose 的新手,我有一个 docker 我的 django 实例和一个 mysql 数据库。我想创建一个自动配置的容器,其中 运行 仅在第一个 docker 运行 上执行命令。在此命令中,我想执行以下任务:
- 进行初始数据库迁移
- 创建管理员超级用户
- 将 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 同步的相同模型,并且我们有一个零时间配置环境运行宁只用一个命令。