为Dockerized Django应用程序播放MySQL数据库

时间:2017-06-01 00:13:49

标签: mysql django docker docker-compose

我的任务是为Django应用程序的开发人员创建一个单击按钮样式的Docker来进行本地开发。

我在Docker Hub上使用docker-compose与私有存储库结合使用,并且运行良好。

除了应用程序没有默认数据。开发人员要求使用完整的prod转储而不是loaddata的夹具。

因此我基于此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

因此我开始使用investigate data-only个容器,但我想知道当我将该容器推送到Docker hub时会发生什么?可以使用从docker-compose烘焙的mysql数据来拉动它吗?

如果没有,那么我该如何修复上述Dockerfile

1 个答案:

答案 0 :(得分:2)

MySQL(以及像Percona Server这样的变体)提供了在docker hub page的“初始化新实例”部分中描述的第一个容器启动时为数据库播种的工具。

  

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

使用此技术的Dockerfile看起来像

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

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

当您docker run此图片时,docker将创建容器,docker-entrypoint.sh将执行sql脚本,然后容器将准备好提供数据。

数据将通过容器重启持续存在 - 种子数据和后续修改。

您可以重用容器以加快启动时间 - 后续容器启动不需要初始化数据库或播种数据。 当您需要原始数据时,请删除容器并再次docker run图像。

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

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

希望这可以帮助你。