【问题标题】:Create MySQL database in Docker container at build time在构建时在 Docker 容器中创建 MySQL 数据库
【发布时间】:2019-05-31 11:48:11
【问题描述】:

我需要创建一个包含大型数据库的 Docker 映像。可以使用指定文件夹中的脚本populate_net_db.sh 填充数据库。我需要创建一个在构建时完成此操作的 Docker 映像,以便使用数据库的开发人员可以创建一个容器,而无需等待很长时间才能填充数据库。

我做了什么(这有效,但不是我需要的):

  • 我可以在运行时创建数据库并使用 mysql Docker 映像填充它,并将所需文件放入 docker-entrypoint-initdb.d 文件夹。当您运行映像时,这将需要大量时间来进行设置,但可以根据需要进行设置,并且我可以完全按照需要使用 docker exec -it "image_name" mysql -u root -p 访问数据库。

  • 我可以在构建时使用 RUN 命令创建相同的数据库,并查看表在构建时设置是否正确,但是,当我运行这样的图像时,会设置一个新的 mysql 数据库,并且数据库来自构建没了。

有没有办法让构建时数据库显示在docker exec -it "image_name" mysql -u root -p 中?

【问题讨论】:

  • 简短回答:因为 MySQL 基础镜像对其数据目录使用 VOLUME 声明,所以您以后无法构建包含任何内容的镜像;它在VOLUME 运行时永远停留在(空)内容上。
  • another question 上,我曾建议使用 docker run -v 将 MySQL 数据保存在主机目录中并共享该目录的 tar 文件。

标签: mysql docker


【解决方案1】:

我设法通过在构建过程中将/var/lib/mysql/ 的内容保存在一个临时文件夹中来解决这个问题:mv /var/lib/mysql /mnt/tmp/。然后我创建了一个入口点脚本放入/docker-entrypoint-initdb.d 文件夹。此脚本在运行时删除/var/lib/mysql/ 内容并将保存状态从/mnt/tmp/ 移出。这会导致 MySQL 重新启动。但是,数据库在容器运行时变得非常可用。对于 27GB 的数据库,此方法需要大约 5 分钟,而从转储文件加载数据库需要超过 1 小时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-26
    • 2022-06-26
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多