【发布时间】:2017-03-07 13:57:05
【问题描述】:
我已经为这个问题苦苦挣扎了一段时间。我想使用一组特定的数据进行性能测试。
为此,我使用了 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 但这没有成功。容器被重建并重新启动,但数据库仍然受到我的测试的影响。目前解决我的问题的唯一方法是删除整个容器和图像。
【问题讨论】:
-
这个答案可能对你有用:stackoverflow.com/a/27572665/1856086
-
@StasMakarov 这与我想要的完全相反。我不想持久化数据库。我只是想从某个点开始一个容器,对它做一些事情,然后把它全部扔掉,这样我就可以从同一个起点重新开始......
-
你可以尝试使用official Dockerfile创建你自己的mysql镜像,但没有
VOLUME /var/lib/mysql这一行(目前是#68)。这样它不应该在删除容器后保存任何数据。它可能远不是这个问题的最佳解决方案,但它可能会奏效。 -
您也可以尝试使用
docker volume rm $volume_hash删除包含mysql 数据的卷。或者使用docker volume rm $(docker volume ls -q)删除所有卷。最后一个命令可以删除有用的东西。 -
@StasMakarov 当使用没有该行#68的确切Dockerfile时,我如何填充图像,以便每次启动容器时都预先填充?我不介意拥有更大的图像,只要创建的容器很短
标签: mysql docker docker-compose dockerfile