如何使用填充数据库进行自动化testing的docker图像?

我想创build容器与MySQL数据库和转储加载集成testing。 每个testing应该连接到一个新的容器,数据库处于相同的状态。 它应该能够读写,但是当testing结束并且容器被销毁时,所有的改变都应该丢失。 我正在使用官方docker回购的“ mysql ”镜像。

1)该图像的文档build议利用“入口点”脚本来导入您在特定文件夹上提供的任何.sql文件。 据我所知,这将每次创build一个新的容器时再次导入转储,所以不是一个好的select。 那是对的吗?

2)这个答案build议使用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服务启动,然后用'localhost'或docker-machine ip添加-h。

我怎样才能解决“2)”? 或者,有没有更好的方法?

如果重新接种数据是一个昂贵的操作,另一个选项是启动/停止Docker容器(以前使用数据库和种子数据构build)。 我在几个月前就使用Spring Boot,Postgres和Docker进行了集成testing ,虽然博客关注于Postgres ,但这个想法是相同的,可以转换成MySQL

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

Flyway更适合于迁移数据库模式,而不是将数据放入其中,但是您可以使用它。 每当你启动你的容器时,只要运行它的迁移,你的数据库将被设置,但是你想要的。 它很容易使用,你也可以使用默认的MySQLdocker容器,而不用搞乱任何设置。 由于许多其他原因,Flyway也很好,例如有一种方法可以对数据库模式进行版本控制,还可以轻松地在生产数据库上执行迁移。

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

  1. 是的,每次启动容器时都会导入数据。 这可能需要很长时间。

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