2017-03-07 76 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腳本 我只是用不同的數據製作多個圖像 –

相關問題