docker - 使用数据库重置 docker 映像
问题描述
我想从 300GB 数据库中获取快照,对其进行一些测试,直到数据库不再处于可测试状态,然后将数据库“重置”到它的快照状态并再次测试。
Docker 似乎很适合这个,但我能找到的只是如何使用 sql server 设置一个空数据库。
是否可以创建一个安装了 sqlserver 的 docker 镜像和一个 300GB 的现有数据库?然后再次拉动图像以重置数据?
解决方案
理论上,是的。在实践中,你会遇到两个大问题:
所有标准 Docker Hub 数据库映像都经过配置,以便它们的数据始终存在于一个卷中。这意味着您无法基于预加载数据的标准图像创建图像;您必须创建自己的基础数据库映像。
Docker 的网络 I/O 开始变得不稳定,单层大小远高于 1 GB。简单地说,通过网络传输 300 GB 图像的机制会很麻烦。
根据数据库内部存储数据的方式,还有一些注意事项。如果有一个 300 GB 的文件,第一次写入它可能会导致尝试复制整个文件。这取决于您通常无法访问或控制的数据库存储和低级 Linux 内核详细信息。
拥抱 Docker 的卷系统可能比试图强制图像为您执行此操作更好。考虑你可以用外部数据启动一个容器,停止并删除它,然后基于相同的数据启动一个新的容器;如果您在两者之间保存基础数据文件的副本,数据库将不会知道您正在从快照重新启动它。
用 PostgreSQL 模拟这个,你可以这样做:
# Start a database container, pointing at local data
docker run \
-d \
--name postgres \
-p 5432:5432 \
-v "$PWD:pgdata:/var/lib/postgresql/data" \
postgres:13
# Seed the database
PGHOST=localhost PGPORT=5432 ./seed-data.py
# Stop the database
docker stop postgres
docker rm postgres
# Save a copy of the database data
tar cvzf pgdata.tar.gz pgdata
然后每次你想运行一个测试,你可以解压这个保存的数据树
rm -rf pgdata
tar xzf pgdata.tar.gz
docker run \
-d \
--name postgres \
-p 5432:5432 \
-v "$PWD:pgdata:/var/lib/postgresql/data" \
postgres:13
PGHOST=localhost PGPORT=5432 ./integration-test.py
有 300 GB 的数据,解压并写出 tar 文件仍然需要一些时间,但这至少是简单的,只依赖于普通工具。
推荐阅读
- r - 带有两个条件和 NA 的 if 语句
- reactjs - 添加新组件时自动重置错误
- php - Laravel ShouldBeUnique 不会让工作变得独一无二
- angular - 角度使图表中的选项可选选项
- swift - 在绘制之前删除 NSTextView 中的自定义属性
- vpn - 致命错误:lipo:无法打开输入文件:wireguard-go-bridge/libwg-go-arm64.a(没有这样的文件或目录
- python-3.x - 我想通过我在 Odoo 中的接收邮件服务器从我的 Gmail 中获取所有退回邮件
- java - 访问 dto 列表中的 dto 值
- java - 用于聚合的 Spring Data MongoDB outputType 未与自定义 ReactiveMongoTemplate 映射
- three.js - GL_OUT_OF_MEMORY 使用 A 帧显示立体图像