我正在开发一个应用程序并尝试实现微服务体系结构。有关位置(城市、邮政编码等)的信息,我从opengeodb.org下载了一个mysql数据库转储。
现在我想把数据库作为docker容器提供。我使用以下dockerfile设置了一个mysql映像,如mysql映像的文档中所述:
FROM mysql
ENV MYSQL_ROOT_PASSWORD=mypassword
ENV MYSQL_DATABASE geodb
WORKDIR /docker-entrypoint-initdb.d
ADD ${PWD}/sql .
EXPOSE 3306
“sql”文件夹包含以原始数据作为insert语句的sql脚本,因此它创建了整个数据库。问题是,这个数据库非常庞大,设置它需要很长时间。
所以我想,也许有可能将创建的数据库保存在一个图像中,因为它是一个只用于只读操作的静态数据库。
我对docker还比较陌生,不太清楚如何做到这一点。
我在Windows10机器上使用docker。
编辑:我通过以下方式实现了我的目标:
我如上所述添加了sql转储文件。
我运行了容器并构建了整个数据库,其中有一个本地目录(“data”文件夹)装载到/var/lib/mysql。
然后停止容器并编辑dockerfile:
FROM mysql
ENV MYSQL_ROOT_PASSWORD=mypassword
ENV MYSQL_DATABASE geodb
WORKDIR /var/lib/mysql
COPY ${PWD}\data .
EXPOSE 3306
所以生成的数据库现在被从本地系统复制到容器中。
2条答案
按热度按时间p4tfgftt1#
原则上你可以这样做:
启动容器
加载数据库
执行
docker commit
生成容器当前状态的映像。另一种选择是在映像构建期间加载到数据库中,但是为此,您必须像在entrypoint脚本中那样启动mysql。
后台启动mysql
等待它初始化
使用加载数据
mysql < sql file
n8ghc7c12#
您可以使用容器创建一个卷,以便在本地计算机上持久化数据库。当您第一次创建容器时,sql
/docker-entrypoint-initdb.d
并将更改存储到卷中。下一次启动容器时,mysql将看到模式已经存在,它将不再运行脚本。https://docs.docker.com/storage/volumes/