微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 docker 打包包含固定 MySQL 数据的 Web 应用程序

如何解决使用 docker 打包包含固定 MySQL 数据的 Web 应用程序

我有一个网站,其中包含与大型、不变的 MysqL 数据库相关联的非常具体的 JS 代码。我希望能够将网站和数据库作为单个包分发给其他人,以便其他人能够在本地运行,因此我一直在研究使用 docker 执行此操作。请注意,我没有使用 docker 来测试正在运行的应用程序:仅用于将其分发给其他人查看。

据我所知,运行已填充 MysqL 数据库的 docker 映像通常在启动数据库后从 .sql 文件加载它。但是,对于我的数据库内容,这会导致填充数据库需要一个小时的等待,因为 .sql 转储有很多 GB,并且需要很长时间才能加载。因此,我想将数据加载到正在运行的数据库中一次,将 db 卷 (/var/lib/MysqL) 保持在图像的本地,并在加载数据后使用 docker commit 创建图像的快照。

然而,这种方法似乎与许多标准的 docker 建议背道而驰:通常 docker commit 不受欢迎,并且 /var/lib/MysqL 存储为单独的数据卷,而不是保存在图像本身中。尽管如此,我的用例似乎有所不同,因为 (a) 数据库中的数据不打算在将来更改 (b) 从 MysqL 转储加载需要很长时间以及 (c) 大型数据存储(而不是js 应用程序代码)是我真正想要包含在图像中的主要内容之一。

那么我的用例是否是打破约定并使用 docker commit 并将 MysqL 文件保存在图像本身而不是单独的数据卷中的正当理由?或者,是否有其他更标准的方法来分发具有大型固定数据库存储的完全可用、完全填充的 Web 应用程序?

解决方法

我发现您可以使用多阶段构建代替 docker commit。在构建的早期阶段,可以使用 RUN 命令填充数据库(例如,导致在 /var/lib/mysql 中创建 DB 文件)。如果 /var/lib/mysql 是数据卷,那么作为构建的最后阶段,可以将整个 /var/lib/mysql 目录复制到永久的非数据卷位置,例如/var/lib/mysql_permanent,使用例如

ENV MYSQL_DATA_DIR=/var/lib/mysql_permanent
# copy the DB files from the previous image
COPY --from=create_database "/var/lib/mysql" "${MYSQL_DATA_DIR}"

然后将使用烘焙到图像中的正确基础数据库文件创建最终图像。最后的构建阶段需要使用指定 mysqld 的 mysqld.cnf 文件运行 datadir=${MYSQL_DATA_DIR} 进程,以访问正确的文件。这样就绕过了对 docker commit 的需求,并在构建阶段完成了所有工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。