我的任务是为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
答案 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。初始化新数据库并播种大量数据可能需要几分钟时间,因此您需要一些逻辑来暂停自动操作,直到您可以成功建立数据库连接。
希望这可以帮助你。