使用Docker创建;“可恢复的”;用于UI测试的MySQL数据库
我们有许多selenium测试,它们在我们的webapp的产品设置上运行。问题是,一些测试在应用程序中做了一些影响数据库的事情 是否可能有一个数据卷或类似的卷,我们可以在每次测试之前“克隆”并连接到一个容器 我们真的只需要一个MySQL数据库,它可以在每次测试之前快速重新创建。偶尔我们会运行到该数据库的模式迁移使用Docker创建;“可恢复的”;用于UI测试的MySQL数据库,mysql,selenium,docker,Mysql,Selenium,Docker,我们有许多selenium测试,它们在我们的webapp的产品设置上运行。问题是,一些测试在应用程序中做了一些影响数据库的事情 是否可能有一个数据卷或类似的卷,我们可以在每次测试之前“克隆”并连接到一个容器 我们真的只需要一个MySQL数据库,它可以在每次测试之前快速重新创建。偶尔我们会运行到该数据库的模式迁移 或者还有其他更适合的方法吗?这是一个很好的问题,可能是Docker的一个非常好的用例。备份MySQL数据库的方法和备份MySQL数据库的方法一样多。下面我将解释其中的一些 但是,请注意,
或者还有其他更适合的方法吗?这是一个很好的问题,可能是Docker的一个非常好的用例。备份MySQL数据库的方法和备份MySQL数据库的方法一样多。下面我将解释其中的一些 但是,请注意,您正在进行权衡。这种方法的缺点是,您的图像可能会变得相当大,并且需要更长的时间来提取 另外,您将遇到的一个问题是,大多数MySQL容器使用一个卷来存储数据。因此,销毁容器不足以清除数据,还需要清除卷。因此,当您执行
docker rm
清除旧容器时,请传递-v
标志以删除卷
选项1:将数据构建到容器中
可以将数据构建到容器中。这样做的好处是,您的容器不会在每次运行时花费任何时间设置数据。这一优势在大数据集需要很长时间才能建立或拆除的情况下变得更加重要。换句话说,“重置”这个数据库几乎是瞬间的
在基本层面上,我们希望这样:
ADD mysql_data.tar.gz /var/lib/mysql
$ docker run -e MYSQL_DATABASE=DB_NAME -e MYSQL_ROOT_PASSWORD=password -d --name my-mysql -v $(pwd)/backup.sql:/docker-entrypoint-initdb.d/backup.sql -p 3306:3306 mysql:latest
#!/bin/bash
PASSED_ARGS="${@}"
docker-compose -f docker-compose.test.yml stop database_test
docker-compose -f docker-compose.test.yml rm -vf database_test
docker-compose -f docker-compose.test.yml run -e PASSED_ARGS="${PASSED_ARGS}" app_test
这里棘手的部分是创建mysql_data.tar.gz
文件(它只是/var/lib/mysql的tar.gz备份)。我们可以这样做:
ADD mysql_data.tar.gz /var/lib/mysql
$ docker run -e MYSQL_DATABASE=DB_NAME -e MYSQL_ROOT_PASSWORD=password -d --name my-mysql -v $(pwd)/backup.sql:/docker-entrypoint-initdb.d/backup.sql -p 3306:3306 mysql:latest
#!/bin/bash
PASSED_ARGS="${@}"
docker-compose -f docker-compose.test.yml stop database_test
docker-compose -f docker-compose.test.yml rm -vf database_test
docker-compose -f docker-compose.test.yml run -e PASSED_ARGS="${PASSED_ARGS}" app_test
mysql:latest
)。请注意,我们使用的是命名卷,我们正在转发端口3306
$docker run-d——命名我的mysql-v我的mysql数据:/var/lib/mysql-p 3306:3306-e mysql\u ROOT\u PASSWORD=PASSWORD mysql:latest
backup.sql
$cat backup.sql | mysql-u root-ppassword-h 127.0.0.1
$docker停止我的mysql
/var/lib/mysql
的备份。请注意,我们使用的是相同的命名卷
$docker run--rm-v我的mysql数据:/var/lib/mysql-v$(pwd):/backup mysql:latest tar czvf/backup/mysql\u data.tar.gz/var/lib/mysql
/var/lib/mysql
的gzip数据,请在Dockerfile中使用它。请注意,我们需要在/
处复制它,因为我们压缩它的方式:
addmysql\u data.tar.gz/
如果您还没有Dockerfile,请使用第一行创建一个Dockerfile
来自mysql:5.7的
$docker build-t我的数据映像:最新。
$docker run-d-p 3306:3306我的数据图像:最新
/var/lib/mysql
的卷
要编辑数据,请重复此过程,但在步骤1中替换现有容器。对于步骤2,进行更改。您将生成一个新的mysql_data.tar.gz,如果您愿意,可以对其进行版本控制。重建Dockerfile后,如果愿意,可以在新标记下发布它
选项2:使用docker入口点initdb.d
MySQL Docker映像有一个功能,当容器第一次运行时,它将在/Docker entrypoint initdb.d
中运行SQL文件。这样做的好处是它可以使用常规MySQL转储来创建数据。缺点是数据库启动速度较慢,因为它每次都恢复所有数据
如果您在/backup.sql
上有一个mysqldump数据,您可以执行以下操作:
ADD mysql_data.tar.gz /var/lib/mysql
$ docker run -e MYSQL_DATABASE=DB_NAME -e MYSQL_ROOT_PASSWORD=password -d --name my-mysql -v $(pwd)/backup.sql:/docker-entrypoint-initdb.d/backup.sql -p 3306:3306 mysql:latest
#!/bin/bash
PASSED_ARGS="${@}"
docker-compose -f docker-compose.test.yml stop database_test
docker-compose -f docker-compose.test.yml rm -vf database_test
docker-compose -f docker-compose.test.yml run -e PASSED_ARGS="${PASSED_ARGS}" app_test
完成后,移除容器及其卷
$ docker rm -v my-mysql
我将使用golang应用服务器和mysql数据库的示例,因为这是我的主要用例:
version: '2'
services:
app_test:
image: golang:1.7-alpine
volumes:
- ./:/go/path/to/src
links:
- database_test
environment:
GOBIN: /go/bin
APP_ENVIRONMENT: test
APP_DB_HOST: database_test
APP_DB_USERNAME: root
APP_DB_DATABASE: app
entrypoint:
- /bin/sh
- -c
- /go/path/to/src/build_and_test.sh
database_test:
image: mysql:5.7
volumes:
- ./schema/test/auto_tests_structure.sql:/docker-entrypoint-initdb.d/a.sql
- ./schema/test/auto_tests_data.sql:/docker-entrypoint-initdb.d/b.sql
ports:
- "3307:3306"
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_DATABASE: app
重要的部分是将.sql
文件装载到mysql容器中,该容器会自动填充所选数据库(通过环境变量mysql\u database
——这在官方mysql图像的文档中),以及链接
项
运行测试如下所示:
ADD mysql_data.tar.gz /var/lib/mysql
$ docker run -e MYSQL_DATABASE=DB_NAME -e MYSQL_ROOT_PASSWORD=password -d --name my-mysql -v $(pwd)/backup.sql:/docker-entrypoint-initdb.d/backup.sql -p 3306:3306 mysql:latest
#!/bin/bash
PASSED_ARGS="${@}"
docker-compose -f docker-compose.test.yml stop database_test
docker-compose -f docker-compose.test.yml rm -vf database_test
docker-compose -f docker-compose.test.yml run -e PASSED_ARGS="${PASSED_ARGS}" app_test
主要的一点是前两个docker compose
命令,它们停止并销毁数据库测试
容器和相关卷。然后运行容器,它将重新创建它
至于速度,我不满意它,为Mac运行Docker。但是我的团队中有一个人正在运行linux,而且对他来说速度要快得多。我基本上就是使用这种方法。每次使用后我都会把容器销毁。嘿@3ve。你能解释一下是怎么做的吗?我是码头工人的新手。它有多快?谢谢!选项1听起来不错。起初,我在这方面做了一些研究,因为我觉得能够将每个更改作为图像的单独版本提交到数据库听起来很不错。但后来我读到,将数据存储在容器中是一个坏主意,卷是一条出路。还是我误解了你?对于大多数用例,s