在启动时使用静态数据进行Docker集成测试

时间:2017-03-07 13:57:06

标签: mysql docker docker-compose dockerfile

我一直在努力解决这个问题。我想使用一组特定的数据进行性能测试。 为实现这一目标,我使用的是Docker-compose,并导出了几个.sql个文件。

当我第一次使用docker-compose builddocker-compose up构建并运行容器时,数据集很好。然后我运行我的测试(也插入)数据。运行我的测试后我想再次执行它,所以我使用docker-compose up重新启动容器。但是这一次,由于某些原因我不明白,最后一次插入的数据(通过我的测试)仍然存在。我现在有不同的行为。

目前我有以下Dockerfile:

FROM mysql:5.7

ENV MYSQL_DATABASE dev_munisense1\
    MYSQL_ROOT_PASSWORD pass

EXPOSE 3306

ADD docker/data/ /docker-entrypoint-initdb.d/

因为我读到mysql Docker镜像运行/docker-entrypoint-initdb.d/中的所有内容。它第一次正常工作。

我也试过这些帖子的建议:

How do i migrate mysql data directory in docker container?

http://txt.fliglio.com/2013/11/creating-a-mysql-docker-container/

How to create populated MySQL Docker Image on build time

How to make a docker image with a populated database for automated tests?

还有几个相同的其他帖子。

目前它们似乎都没有。

每次启动容器时,如何确保数据集完全相同?无需每次都重建图像(由于数据集较大,这需要很长时间)。

提前致谢

编辑:

我也尝试使用不同的参数运行容器,例如: docker-compose up --force-recreate --build mysql但这没有成功。容器已重建并重新启动,但数据库仍受我的测试影响。目前解决我问题的唯一方法是删除整个容器和图像。

2 个答案:

答案 0 :(得分:1)

我设法通过执行以下操作来解决问题(使用mysql映像):

  1. 更改sql存储的挂载点(这实际上是导致问题的原因)我使用了这里建议的解决方案:How to create populated MySQL Docker Image on build time但是我通过运行sed命令来完成它:var newLines = File.ReadLines(path) .Select((line, index) => new { line, index, fields = line.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries) }) .GroupBy(x => x.index / 5) .Select(g => new { Col1First = g.First().fields[0], Col4Max = g.Max(x => decimal.Parse(x.fields[3], NumberFormatInfo.InvariantInfo)), Col4Min = g.Min(x => decimal.Parse(x.fields[3], NumberFormatInfo.InvariantInfo)), Col3Sum = g.Sum(x => int.Parse(x.fields[2])) }) .ToList();

  2. 将我的脚本添加到容器内的文件夹

  3. 运行使用守护程序插入数据的import.sh脚本(使用wait-for-it.sh脚本)
  4. 删除sql脚本
  5. 像常规
  6. 一样公开端口

    docker文件看起来像这样(变量用于选择不同的SQL文件,我想要图像的多个版本):

    RUN sed -i 's|/var/lib/mysql|/var/lib/mysql2|g' /etc/mysql/my.cnf

    脚本如下所示:

    FROM mysql:5.5.54
    
    ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /utils/wait-for-it.sh
    COPY docker/import.sh /usr/local/bin/
    
    RUN sed -i 's|/var/lib/mysql|/var/lib/mysql2|g' /etc/mysql/my.cnf
    
    ARG MYSQL_DATABASE
    ARG MYSQL_USER
    ARG MYSQL_PASSWORD
    ARG MYSQL_ROOT_PASSWORD
    ARG MYSQL_ALLOW_EMPTY_PASSWORD
    ARG DEVICE_INFORMATION
    ARG LAST_NODE_STATUS
    ARG V_NODE
    ARG NETWORKSTATUS_EVENTS
    
    ENV MYSQL_DATABASE=$MYSQL_DATABASE \
        MYSQL_USER=$MYSQL_USER \
        MYSQL_PASSWORD=$MYSQL_PASSWORD \
        MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \
        DEVICE_INFORMATION=$DEVICE_INFORMATION \
        LAST_NODE_STATUS=$LAST_NODE_STATUS \
        V_NODE=$V_NODE \
        MYSQL_ALLOW_EMPTY_PASSWORD=$MYSQL_ALLOW_EMPTY_PASSWORD
    
    #Set up tables
    COPY docker/data/$DEVICE_INFORMATION.sql /usr/local/bin/device_information.sql
    COPY docker/data/$NETWORKSTATUS_EVENTS.sql /usr/local/bin/networkstatus_events.sql
    COPY docker/data/$LAST_NODE_STATUS.sql /usr/local/bin/last_node_status.sql
    COPY docker/data/$V_NODE.sql /usr/local/bin/v_node.sql
    
    
    RUN chmod 777 /usr/local/bin/import.sh && chmod 777 /utils/wait-for-it.sh && \
        /bin/bash /entrypoint.sh mysqld --user='root' & /bin/bash /utils/wait-for-it.sh -t 0 localhost:3306 -- /usr/local/bin/import.sh; exit
    RUN rm -f /usr/local/bin/*.sql
    
    ENTRYPOINT ["docker-entrypoint.sh"]
    
    EXPOSE 3306
    CMD ["mysqld"]
    

    所以现在我要做的就是开始我的性能测试

    #!/bin/bash
    echo "Going to insert the device information"
    mysql  --user=$MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DATABASE < /usr/local/bin/device_information.sql
    echo "Going to insert the last_node_status"
    mysql  --user=$MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DATABASE < /usr/local/bin/last_node_status.sql
    echo "Going to insert the v_node"
    mysql  --user=$MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DATABASE < /usr/local/bin/v_node.sql
    echo "Going to insert the networkstatus_events"
    mysql  --user=$MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DATABASE < /usr/local/bin/networkstatus_events.sql
    echo "Database now has the following tables"
    mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DATABASE --execute="SHOW TABLES;"
    

    这些行中的几个(略有不同,导致不同的容器名称)

答案 1 :(得分:0)

在您的测试后运行docker-compose down会破坏与您的docker-compose.yml

相关的所有内容

Docker Compose是一个容器生命周期管理器,默认情况下它会尝试将所有内容保存在多个运行中。正如Stas Makarov提到的那样,VOLUME图片中定义了mysql,用于将数据保留在容器外部。