我一直在努力解决这个问题。我想使用一组特定的数据进行性能测试。
为实现这一目标,我使用的是Docker-compose,并导出了几个.sql
个文件。
当我第一次使用docker-compose build
和docker-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
但这没有成功。容器已重建并重新启动,但数据库仍受我的测试影响。目前解决我问题的唯一方法是删除整个容器和图像。
答案 0 :(得分:1)
我设法通过执行以下操作来解决问题(使用mysql映像):
更改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();
将我的脚本添加到容器内的文件夹
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
,用于将数据保留在容器外部。