为停靠的Django应用程序植入MySQL数据库

为停靠的Django应用程序植入MySQL数据库,mysql,django,docker,docker-compose,Mysql,Django,Docker,Docker Compose,我的任务是为Django应用程序的开发人员创建一个点击按钮风格的Docker应用程序,以便进行本地开发 我正在使用docker compose与我的docker Hub上的私有回购相结合,它运行良好 除了应用程序没有默认数据。开发人员要求使用完整的产品转储,而不是带有loaddata的fixture 因此,我基于这个Dockerfile构建了一个容器 FROM python:2.7 COPY . /opt/mysite.com WORKDIR /opt/mysite.com ENV WAIT

我的任务是为Django应用程序的开发人员创建一个点击按钮风格的Docker应用程序,以便进行本地开发

我正在使用
docker compose
与我的docker Hub上的私有回购相结合,它运行良好

除了应用程序没有默认数据。开发人员要求使用完整的产品转储,而不是带有
loaddata
的fixture

因此,我基于这个Dockerfile构建了一个容器

FROM python:2.7

COPY . /opt/mysite.com
WORKDIR /opt/mysite.com

ENV WAITFORIT_VERSION="v1.3.1"
RUN wget -q -O /usr/local/bin/waitforit https://github.com/maxcnunes/waitforit/releases/download/$WAITFORIT_VERSION/waitforit-linux_amd64 \
    && chmod +x /usr/local/bin/waitforit

RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get -y update && apt-get -y install mysql-client nodejs

RUN pip install -r requirements/local.txt

RUN npm install
RUN ./node_modules/.bin/babel-node ./node_modules/.bin/webpack

CMD waitforit -full-connection=tcp://mysql:3306 -timeout=60 -debug && mysql -u root -h mysql --password=**** mysite_develop < prod.sql && /bin/bash -c "source /opt/mysite.com/env.local && python manage.py collectstatic --noinput && python /opt/mysite.com/manage.py runserver 0.0.0.0:5000"
来自python:2.7的

抄袭/opt/mysite.com
WORKDIR/opt/mysite.com
ENV WAITFORIT_VERSION=“v1.3.1”
运行wget-q-O/usr/local/bin/waitforithttps://github.com/maxcnunes/waitforit/releases/download/$WAITFORIT_VERSION/WAITFORIT-linux_amd64\
&&chmod+x/usr/local/bin/waitforit
运行curl-sLhttps://deb.nodesource.com/setup_6.x |猛击-
运行apt get-y更新和apt get-y安装mysql客户端nodejs
运行pip安装-r requirements/local.txt
运行npm安装
运行./node\u modules/.bin/babel节点./node\u modules/.bin/webpack
CMD waitforit-完全连接=tcp://mysql:3306 -timeout=60-debug&&mysql-u root-h mysql-password=**mysite\u develope
所有这些都可以很好地工作,只是在容器启动后需要很长时间才能看到
localhost:5000

因此,我开始只使用
数据
容器,但我想知道当我将该容器推到Docker hub时会发生什么?它可以从docker compose中烘焙到mysql数据中吗

如果没有,那么我如何修复上面的
Dockerfile

MySQL(以及Percona Server等变体)提供了一种工具,用于在第一个容器启动时播种数据库,如中的“初始化新实例”部分所述

当容器第一次启动时,一个新的数据库 将创建指定的名称,并使用提供的 配置变量。此外,它将使用 中找到的扩展名.sh、.sql和.sql.gz /docker入口点initdb.d。文件将按字母顺序执行 秩序。通过挂载SQL,您可以轻松地填充mysql服务 转储到该目录中,并提供自定义图像 数据。默认情况下,SQL文件将导入指定的数据库 通过MYSQL_数据库变量

使用此技术的Dockerfile将如下所示

FROM mysql:8
COPY seed-data.sql /docker-entrypoint-initdb.d/
注意:目录尾部斜杠很重要

当您运行
docker
此图像时,docker将创建容器,将执行sql脚本,然后容器将准备好提供数据

数据将通过容器重新启动(种子数据和后续修改)保持

您可以重用容器以加快启动时间-后续容器启动不需要初始化数据库或为数据设定种子。 当您需要原始数据时,删除容器并再次运行图像

删除容器时,请记住删除包含db数据的docker卷:
docker rm-v$container\u NAME

我使用此方法来提供语言/框架POC以及CI/CD。初始化新数据库和植入大量数据可能需要几分钟的时间,因此您需要一些逻辑来暂停自动操作,直到成功建立数据库连接

希望这对你有所帮助