2017-03-07 75 views
0

我一直在为这个问题苦苦挣扎了一段时间。我想要使​​用一组特定的数据进行性能测试。 为了实现这一点,我使用Docker-compose,并且导出了几个.sql文件。启动时使用静态数据进行Docker集成测试

当我第一次使用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-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但这并没有成功。容器被重建并重新启动,但数据库仍受我的测试影响。目前唯一解决我的问题是删除整个容器和图像。

+0

这个答案可能对您有用:HTTP:// stackoverflow.com/a/27572665/1856086 –

+0

@StasMakarov很好,它和我想要的完全相反。我不想坚持数据库。我只想从某个点开始一个容器,做一些东西,然后把它全部扔掉,这样我就可以从相同的开始开始...... –

+0

您可以尝试使用[官方Dockerfile](https://github.com/docker-library/mysql/blob/eeb0c33dfcad3db46a0dfb24c352d2a1601c7667/5.7/Dockerfile#L68),但没有'VOLUME/var/lib/mysql'行(目前#68)。 这种方式删除容器后不应该保存任何数据。这可能远不是这个问题的最佳解决方案,但它可能有效。 –

回答

0

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

  1. 更改SQL存储的安装点(这是实际问题造成的),我用了这里的解决方案建议:How to create populated MySQL Docker Image on build time,但我做到了通过运行一个sed命令:RUN sed -i 's|/var/lib/mysql|/var/lib/mysql2|g' /etc/mysql/my.cnf

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

    ,使用守护程序(使用插入数据
  3. 运行import.sh脚本脚本)
  4. 删除SQL脚本
  5. 暴露端口像普通

泊坞窗文件看起来像这样(变量用来选择不同的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;" 

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

#!/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 

夫妇以上的这些线(略有不同,导致不同的容器名称)

0

运行docker-compose down你的测试会破坏你的docker-compose.yml

泊坞撰写相关的一切后,是一个容器生命周期管理器默认情况下它试图保持在多个运行的一切。由于Stas Makarov提到,在mysql图像中定义了一个VOLUME,该图像将数据保留在容器外部。

+0

这个“down”命令似乎破坏了容器,但是现在每次我运行docker-compose时它都必须重新插入所有的测试数据。 –

+0

@antonsteenvoorden您可以将初始数据添加到映像中,而不是在启动后添加,以便下一次运行包含一些初始状态。 – Matt

+0

我设法解决这个问题(与MySQL图像),通过执​​行以下操作: 1.更改SQL存储的挂载点(这实际上是造成问题)我使用这里建议的解决方案:http:// stackoverflow。 com/questions/32482780/how-to-create-populated-mysql-docker-image-on-build-time但是我通过运行sed命令来完成它:'运行sed -i's |/var/lib/mysql |/var/lib/mysql2 | g'/etc/mysql/my.cnf' 2.将我的脚本添加到容器内的文件夹中 3.运行import.sh脚本,该脚本使用守护程序插入数据 4.删除sql脚本 我只是用不同的数据制作多个图像 –

相关问题