为 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 项目中被阻止
Spring Cloud Consul 和 Consul Clients dockerized