我是 docker-compose 的新手,我有一个带有我的 django 实例和 mysql 数据库的 docker。我想创建一个 self 自动配置的容器,它只在第一次运行 docker 时运行命令。在此命令中,我想执行以下任务:
- 进行初始数据库迁移
- 创建管理员 super 用户
- 将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/