【问题标题】:How to use docker-compose to restore fresh databases quickly for integration tests?如何使用 docker-compose 快速恢复新数据库以进行集成测试?
【发布时间】:2018-09-28 00:35:58
【问题描述】:

我想在每次运行时使用处于已知状态的数据库运行集成和端到端测试,以使测试独立且可重复。一个简单的方法是使用 docker-compose 创建一个数据库容器,每次从转储文件加载方案和数据。但是,这对于每次测试都恢复数据库太慢了。

似乎更好的方法是在 docker 容器或卷中恢复数据库一次,然后将容器/卷数据库文件夹复制(挂载?)到测试将使用的数据库容器中,并让每个测试重新复制/挂载容器/卷,使其保持新鲜。

但是,我不确定使用 docker-compose 执行此操作的最佳方法是什么。谁能提供一个关于如何做到这一点的最小示例或解释?

【问题讨论】:

    标签: docker testing docker-compose integration-testing end-to-end


    【解决方案1】:

    您可以使用其底层数据存储的主机目录来启动数据库。如果这样做,则可以创建目录的 tar 文件,并在每次测试运行时重新解压缩。

    mkdir mysql
    docker run -d -p 3306:3306 -v ./mysql:/var/lib/mysql --name mysql mysql
    mysql -h 127.0.0.1 < dump.sql
    docker stop mysql
    docker rm mysql
    tar czf mysql.tar.gz mysql
    
    rm -rf mysql
    tar xzf mysql.tar.gz
    docker run -d -p 3306:3306 -v ./mysql:/var/lib/mysql --name mysql mysql
    MYSQL_HOST=127.0.0.1 ./integration_test
    docker stop mysql
    docker rm mysql
    

    您必须单独分发数据转储(如果您以其他方式使用 AWS,则 S3 存储桶是一个好地方),但由于它“只是”测试数据,您始终可以从数据库转储重新创建,所以它不是特别珍贵,您无需跟踪其版本历史或尝试将其保留在源代码管理中。

    【讨论】:

    • 使用 tar 比将 /msql 的内容复制到测试容器上的 /var/lib/mysql 有什么好处吗?
    • 在这种情况下使用docker cp 有点笨拙(您需要将docker run 拆分为docker createdocker start,以及它们之间的docker cp)。除此之外,它会工作得很好。
    • 感谢您的帮助。如何将这些命令转换为 docker-compose 命令(或者我不能在 docker-compose 中模拟它,我是否需要使用 Dockerfile 代替)?我可以获得一个使用 mysql 映像和 docker-entrypoint-initdb.d 加载数据库转储的 docker 容器,但是由于两个 mysqld 进程正在运行和尝试,使用 docker-compose v3 和卷会阻止第二个容器访问卷使用相同的数据和日志文件。
    • 第二个docker run 命令可能会转换为与您已经拥有的docker-compose.yml 非常相似的东西;您只是将保存的 tar 文件解压缩到以 volumes: 命名的主机目录中。
    • 如果your other question 与此相关,还值得注意的是,我不会将这个答案的两半放在同一个docker-compose.yml 文件中。将数据库转储一次,然后在运行测试的docker-compose.yml 文件中引用它。
    猜你喜欢
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2021-01-05
    • 2020-06-16
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多