针对Dockerized Django应用播种MySQL数据库

我的任务是为Django应用程序的开发人员创build一个Docker的点击button风格的使用来进行本地开发。

我在docker-compose集线器上使用了docker-compose和private repos,它工作的很好。

除了应用程序没有默认的数据。 开发者已经要求使用完整的prod转储,而不是使用loaddata灯具。

所以我build立了一个基于这个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" 

所有的工作都很好,除了在容器启动后能够看到localhost:5000需要很长时间。

因此,我开始调查 data-only容器,但是我想知道将容器推送到Docker中心会发生什么情况? 是否可以从docker-compose mysql数据烘焙到一起?

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

MySQL(和像Percona Server这样的变体)提供了在Docker Hub页面的“Initializing a fresh instance”一节中描述的第一个容器启动上的数据库种植设施。

首次启动容器时,将使用提供的configurationvariables创build并初始化具有指定名称的新数据库。 此外,它将执行在/docker-entrypoint-initdb.d中find的具有扩展名.sh,.sql和.sql.gz的文件。 文件将按字母顺序执行。 通过将SQL转储装载到该目录中并提供自定义图像和贡献数据,可以轻松地填充您的mysql服务。 SQL文件将被默认导入到由MYSQL_DATABASEvariables指定的数据库中。

使用这种技术的Dockerfile将如下所示

 FROM mysql:8 COPY seed-data.sql /docker-entrypoint-initdb.d/ 

注意:目录尾部的斜线很重要。

当docker docker run这个镜像时, docker将创build容器, docker-entrypoint.sh将执行sql脚本,然后容器将准备好提供数据。

数据将持续通过容器重启 – 种子数据和随后的修改。

您可以重新使用容器以加快启动时间 – 随后的容器启动将不需要初始化数据库或播种数据。 当你需要原始数据时,删除容器, docker run再次docker run图像。

删除容器时,请记得删除包含数据库数据的泊坞窗卷: docker rm -v $CONTAINER_NAME

我使用这种方法为语言/框架POC以及CI / CD提供标准数据 。 初始化一个新的数据库和播种大量的数据可能需要几分钟的时间,所以你需要一些逻辑来暂停自动化的操作,直到你能成功build立一个数据库连接。

希望这可以帮助你的方式。