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

我一直在这个问题上挣扎了一会儿。 我想用一组特定的数据做一个性能testing。 为了实现这一点,我使用Docker-compose,并导出了几个.sql文件。

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

目前我有以下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/所有/docker-entrypoint-initdb.d/ 。 第一次正常工作。

我也尝试了这些post的build议:

如何在Docker容器中迁移mysql数据目录?

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

如何在构build时创build已填充的MySQL Docker镜像

如何使用填充数据库进行自动化testing的docker图像?

和几个相同的其他职位。

他们目前似乎没有工作。

每次启动容器时,如何确保数据集完全相同? 而不必每次重build图像(这需要很长的时间,因为一个大的数据集)。

提前致谢

编辑:

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

运行docker-compose down后,你的testing将会破坏与你docker-compose.yml相关的所有东西

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

我设法解决这个问题(与MySQL图像)通过执行以下操作:

  1. 更改sql存储的挂载点(这是实际导致的问题)我使用了这里build议的解决scheme: 如何在构build时创build填充的MySQL Docker镜像,但是我通过运行sed命令来完成: RUN sed -i 's|/var/lib/mysql|/var/lib/mysql2|g' /etc/mysql/my.cnf

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

  3. 运行使用守护程序插入数据的import.sh脚本(使用wait-for-it.sh脚本)
  4. 删除sql脚本
  5. 暴露像普通的端口

docker文件看起来像这样(variables用来select不同的SQL文件,我想要多个版本的图像):

 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;" 

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

 #!/usr/bin/env bash echo "Shutting down previous containers" docker-compose -f docker-compose.yml down docker-compose -f docker-compose-test-10k-half.yml down docker-compose -f docker-compose-test-100k-half.yml down docker-compose -f docker-compose-test-500k-half.yml down docker-compose -f docker-compose-test-1m-half.yml down echo "Launching rabbitmq container" docker-compose up -d rabbitmq & sh wait-for-it.sh -t 0 -h localhost -p 5672 -- sleep 5; echo "Going to execute 10k test" docker-compose -f docker-compose-test-10k-half.yml up -d mysql_10k & sh wait-for-it.sh -t 0 -h localhost -p 3306 -- sleep 5 && ./networkstatus-event-service --env=performance-test --run-once=true; docker-compose -f docker-compose-test-10k-half.yml stop mysql_10k 

更多这些行的几个(稍有不同,导致不同的容器名称)