我想创建带有MySQL db的容器和为集成测试加载的转储。每个测试应连接到一个新容器,DB处于相同状态。它应该能够读写,但是当测试结束并且容器被销毁时,所有更改都应该丢失。我正在使用官方码头仓库中的“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)
当我运行build时,即使我可以在原始图像的容器上连接到mysql。我尝试sleep 5
等待mysqld服务启动,并添加-h with“localhost”或docker-machine ip。
如何修复“2)”?或者,有更好的方法吗?
答案 0 :(得分:1)
如果重新播种数据是一项昂贵的操作,另一个选择是启动/停止Docker
容器(之前使用数据库和种子数据构建)。几个月前我在博客上发表了这篇文章Integration Testing using Spring Boot, Postgres and Docker,虽然博客侧重于Postgres
,但这个想法是一样的,可以翻译成MySQL
。
答案 1 :(得分:1)
标准MySQL映像的启动速度很慢,因此使用为这种情况准备的东西可能会有用,例如:
https://github.com/awin/docker-mysql
您也可以包含数据或在Flyway情况下使用,但这应该会加快速度。
答案 2 :(得分:0)
在使用数据库迁移工具之前我是如何解决这个问题的,特别是飞路:http://flywaydb.org/documentation/database/mysql.html
Flyway更多的是用于迁移数据库模式而不是将数据放入其中,但您可以使用它。每当您启动容器时,只需针对它运行迁移,您将根据需要设置数据库。它易于使用,您也可以使用默认的MySQL docker容器,而无需处理任何设置。 Flyway也有很多其他原因,比如有办法对数据库模式进行版本控制,以及能够轻松地在生产数据库上执行迁移。
要使用干净的DB运行集成测试,我只需要在测试之前插入一个初始数据集,然后再截断所有表。我不确定你的数据集有多大,但我认为这通常比每次重启一个mysql容器都快。
答案 3 :(得分:0)
是的,每次启动容器时都会导入数据。这可能需要很长时间。
您可以查看我创建的示例图像
https://github.com/kliewkliew/mysql-adventureworks
https://hub.docker.com/r/kliew/mysql-adventureworks/
我的Dockerfile通过安装MySQL构建映像,导入示例数据库(来自.sql
文件),并将入口点设置为自动启动MySQL服务器。从此映像启动容器时,它将预先加载数据库中的数据。