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

Posted

技术标签:

【中文标题】为 Dockerized Django 应用程序播种 MySQL 数据库【英文标题】:Seeding a MySQL DB for a Dockerized Django App 【发布时间】:2017-11-01 22:52:21 【问题描述】:

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

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

除非应用没有默认数据。开发人员已要求使用完整的产品转储而不是带有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 之外,一切都很好。

因此我开始investigatedata-only 容器,但我想知道当我将该容器推送到 Docker 集线器时会发生什么?可以用从docker-compose烘焙的mysql数据拉取吗?

如果不是,那我该如何解决上述Dockerfile

【问题讨论】:

【参考方案1】:

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 图像。

删除容器时,记得删除包含db数据的docker卷:docker rm -v $CONTAINER_NAME

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

希望这对您有所帮助。

【讨论】:

以上是关于为 Dockerized Django 应用程序播种 MySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

在 VS Code 中调试 dockerized Django 导致错误“等待启动器连接超时”

CORS 在 dockerized Django REST + Angular 项目中被阻止

数据在多容器 Dockerized 应用程序中的啥位置?

Spring Cloud Consul 和 Consul Clients dockerized

无法将 dockerized spring boot 应用程序连接到 dockerized postgresql

通过 Dockerized Spring Boot 应用程序填充 Dockerized PostgreSQL 数据库