分享

使用Docker为UI测试创建“可恢复的”MySQL数据库

 印度阿三17 2019-06-23

我们有许多硒测试,它们运行在我们的webapp的类似生产的设置上.问题是某些测试会影响数据库的应用程序.

是否可以拥有一个数据量或类似数据,我们可以在每次测试之前“克隆”并附加到容器中?

我们真的只需要一个可以在每次测试之前快速重新创建的MySQL数据库.偶尔我们会将模式迁移运行到该数据库.

还是有另一种方法更适合这个吗?

解决方法:

这是一个很好的问题,对于Docker来说可能是一个非常好的用例.有很多方法可以做到这一点,因为有办法备份MySQL数据库.我将在下面解释其中的一些.

但请注意,您正在进行权衡.这种方法的缺点是你的图像会变得非常大,并且需要更长的时间来拉动.

此外,您将遇到的一个问题是,大多数MySQL容器都使用卷/ var / lib / mysql(存储数据的位置).因此,销毁容器不足以清除数据 – 您还需要清除卷.因此,当您使用docker rm清除旧容器时,请传递-v标志以删除卷.

选项1:将数据构建到容器中

可以将数据构建到容器中.这样做的好处是,您的容器在每次运行时都不会花费任何时间来设置数据.对于需要很长时间设置或拆除的大数据集,这种优势变得更加重要.换句话说,“重置”该数据库几乎是即时的.

在基本层面上,我们想要这样的东西:

ADD mysql_data.tar.gz /var/lib/mysql

这里棘手的部分是创建mysql_data.tar.gz文件(它只是/ var / lib / mysql的tar.gz备份).我们可以这样做:

>使用空数据库运行容器(我将使用mysql:latest here).请注意,我们正在使用命名卷,我们正在转发端口3306.

$docker run -d –name my-mysql -v my-mysql-data:/ var / lib / mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD = password mysql:latest
>设置数据库.构建架构并插入所有测试数据.假设您有一个数据库备份backup.sql.

$cat backup.sql | mysql -u root -ppassword -h 127.0.0.1
>停止容器.我们不希望MySQL运行.数据将保留在指定的卷中.

$docker stop my-mysql
>创建/ var / lib / mysql的备份.请注意,我们使用的是相同的命名卷.

$docker run –rm -v my-mysql-data:/ var / lib / mysql -v $(pwd):/ backup mysql:latest tar czvf /backup/mysql_data.tar.gz / var / lib / mysql
>既然你有来自/ var / lib / mysql的gzip压缩数据,请在你的Dockerfile中使用它.请注意,我们需要将其复制到/因为我们压缩它的方式:

添加mysql_data.tar.gz /

如果您还没有Dockerfile,请使用第一行创建一个

从mysql:5.7
>(见工作)将Dockerfile构建到包含数据的容器映像中.然后运行容器.

$docker build -t my-data-image:latest.

$docker run -d -p 3306:3306 my-data-image:latest

Docker将自动提取文件作为构建的一部分.你完成了. Dockerfile中的容器将始终包含您的干净数据.要“重置”容器,只需停止它即可.删除它用于/ var / lib / mysql的卷.

要编辑数据,请重复此过程,但在步骤1中替换现有容器.对于步骤2,进行更改.您将生成一个新的mysql_data.tar.gz,如果您愿意,可以对其进行版本控制.重建Dockerfile后,如果愿意,可以在新标记下发布它.

选项2:使用docker-entrypoint-initdb.d

MySQL Docker镜像具有以下功能:当容器第一次运行时,它将在/docker-entrypoint-initdb.d中运行SQL文件.这样做的好处是它可以使用常规的MySQL转储来创建数据.缺点是数据库启动速度较慢,因为它每次都会恢复所有数据.

如果您在./backup.sql中有数据的mysqldump,则可以执行以下操作:

$docker run -e MYSQL_DATABASE=DB_NAME -e MYSQL_ROOT_PASSWORD=password -d --name my-mysql -v ./backup.sql:/docker-entrypoint-initdb.d/backup.sql -p 3306:3306 mysql:latest

完成后,删除容器及其卷.

$docker rm -v my-mysql
来源:https://www./content-2-259751.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多