【问题标题】:How to make a docker image with a populated database for automated tests?如何使用填充数据库制作 docker 映像以进行自动化测试?
【发布时间】:2016-06-02 19:38:50
【问题描述】:

我想创建带有 MySQL 数据库的容器和为集成测试加载的转储。每个测试都应该连接到一个新的容器,数据库处于相同的状态。它应该可以读写,但是当测试结束并且容器被销毁时,所有更改都应该丢失。我正在使用来自官方 docker repo 的“mysql”图像。

1) image's docs 建议利用“入口点”脚本,该脚本将导入您在特定文件夹中提供的任何 .sql 文件。据我了解,每次创建新容器时都会再次导入转储,因此不是一个好选择。对吗?

2) SO answer 建议使用 RUN 语句扩展该映像以启动 mysql 服务并导入所有转储。这似乎是要走的路,但我不断得到

mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

紧随其后

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

当我运行构建时,即使我可以在原始图像的容器上很好地连接到 mysql。我尝试sleep 5 等待 mysqld 服务启动,并添加 -h 和 'localhost' 或 docker-machine ip。

如何修复“2)”?或者,有没有更好的方法?

【问题讨论】:

    标签: mysql docker integration-testing


    【解决方案1】:

    我之前解决这个问题的方法是使用数据库迁移工具,特别是 flyway:http://flywaydb.org/documentation/database/mysql.html

    Flyway 更多的是用于迁移数据库架构而不是将数据放入其中,但您可以使用任何一种方式。每当您启动容器时,只需针对它运行迁移,您的数据库就会按照您的意愿进行设置。它易于使用,您也可以只使用默认的 MySQL docker 容器,而无需乱搞任何设置。 Flyway 也有很多其他原因,比如有一种方法可以对数据库模式进行版本控制,以及能够轻松地在生产数据库上执行迁移。

    要使用干净的数据库运行集成测试,我只需在测试之前插入一个初始数据集,然后截断所有表。我不确定您的数据集有多大,但我认为这通常比每次重新启动 mysql 容器要快。

    【讨论】:

      【解决方案2】:
      1. 是的,每次启动容器时都会导入数据。这可能需要很长时间。

      2. 您可以查看我创建的示例图像 https://github.com/kliewkliew/mysql-adventureworks https://hub.docker.com/r/kliew/mysql-adventureworks/ 我的 Dockerfile 通过安装 MySQL 构建映像,导入示例数据库(从 .sql 文件),并将入口点设置为自动启动 MySQL 服务器。当您从此映像启动容器时,它会将数据预加载到数据库中。

      【讨论】:

        【解决方案3】:

        如果重新播种数据是一项昂贵的操作,另一种选择是启动/停止Docker 容器(之前使用数据库和种子数据构建)。几个月前我在博客上写过这个Integration Testing using Spring Boot, Postgres and Docker,虽然博客关注Postgres,但想法是一样的,可以翻译成MySQL

        【讨论】:

          【解决方案4】:

          标准的 MySQL 映像启动速度很慢,因此使用为这种情况准备更多的东西可能很有用:

          https://github.com/awin/docker-mysql

          您也可以包含数据或与 Flyway 情况一起使用,但它应该会加快速度。

          【讨论】:

          • 这对我有用,是最简单的解决方案。请注意,它不是基于官方的 mysql docker 映像,而是用于测试情况可能还可以。
          猜你喜欢
          • 2018-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-16
          • 2020-03-04
          • 2015-05-01
          • 2015-01-18
          • 1970-01-01
          相关资源
          最近更新 更多