docker中的巨大静态(mysql)数据库

时间:2018-11-25 10:55:10

标签: mysql docker dockerfile

我正在开发一个应用程序,并尝试实现微服务体系结构。有关位置(城市,邮政编码等)的信息,我从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”文件夹包含带有原始数据作为插入语句的sql脚本,因此它创建了整个数据库。问题是,数据库确实很大,建立起来需要很长时间。

所以我想,也许可以将创建的数据库保存在映像中,因为它是仅用于只读操作的静态数据库。

我对docker还是陌生的,不确定如何实现。

我在Windows 10计算机上使用docker。

编辑: 我通过以下操作实现了自己的目标:

  1. 我如上所述添加了sql dump文件。
  2. 我运行了容器,并使用安装在/ var / lib / mysql上的本地目录(“数据”文件夹)构建了整个数据库。
  3. 然后停止容器并编辑Dockerfile:

    FROM mysql
    ENV MYSQL_ROOT_PASSWORD=mypassword
    ENV MYSQL_DATABASE geodb
    WORKDIR /var/lib/mysql
    COPY ${PWD}\data .
    EXPOSE 3306
    

    因此,现在正在将生成的数据库从本地系统复制到容器中。

2 个答案:

答案 0 :(得分:0)

您可以使用容器创建一个卷以将数据库持久存储在本地计算机上。首次创建容器时,将执行/docker-entrypoint-initdb.d中的SQL,并将所做的更改存储到卷中。下次启动容器时,MySQL将看到该模式已经存在,并且不会再次运行脚本。

https://docs.docker.com/storage/volumes/

答案 1 :(得分:0)

原则上,您可以这样实现:

  1. 启动容器
  2. 加载数据库
  3. 执行docker commit来生成容器当前状态的图像。

另一种选择是在映像构建期间加载数据库,但是为此,您必须像在entrypoint脚本中那样启动mysql。

  1. 在后台启动mysql
  2. 等待它初始化
  3. 使用mysql < sql file
  4. 加载数据