Fork 仓库
在几秒内克隆整个生产环境(应用、数据库、配置文件)。任意大小,零额外磁盘占用。想 fork 多少次都可以。
一句话总结:克隆生产环境,万无一失。
观看教程
准备一些可以”破坏”的内容
首先,给运行中的应用创建一个文件,用来证明 fork 的隔离性。在 VS Code 中打开仓库,然后在仓库内创建一个标记文件:
rdc vscode connect -m my-server -r my-app
echo "Hello from production" > index.html
现在 fork 它。
Fork
rdc repo fork --parent my-app -m <machine-name> --tag experiment --up 一条命令即可克隆整个 repo:应用程序、数据库和配置文件。无论 repo 大小如何,fork 时间恒定,无论是 1 GB、100 GB 还是 1 TB。
一条命令。它克隆了一切(应用、数据库、配置文件),而且只用了几秒。再运行一次,你就得到另一个独立克隆。
为什么这么快?
原因是 btrfs reflinks。fork 创建了一个新的文件系统树,指向与父仓库相同的数据块。fork 时不复制任何数据,完全是元数据操作,因此父仓库的大小不会影响 fork 耗时。
Fork 的工作原理相同。1 GB、100 GB、1 TB,每次时间相同。
什么是共享的,什么是你独有的
把父仓库想象成一个固定的数据源。你的 fork 是它的写时复制视图。向 fork 写入的数据留在 fork 内,父仓库不会移动,无论有多少个 fork 指向它。
你无法握住太阳,但你可以把它握在镜子里。
父仓库后来发生变化怎么办?
现在想象快照的概念。当你 fork 时,你将父仓库冻结在那个确切的时刻。父仓库继续变化,你的 fork 不会。
如果父仓库后来发生了变化,你的 fork 仍然停留在原来的位置。
你无法握住一条河,但你可以把它握在照片里。
磁盘占用保持平稳
这就是你的磁盘不会爆满的原因。100 GB 仓库的五个 fork?总占用仍约为 100 GB。你只为每个 fork 中实际修改的内容付出磁盘代价。
Fork 五次也无妨,你的磁盘甚至感觉不到。
fork 不会继承的内容:密钥
fork 有一件事刻意不继承:密钥。fork 启动时没有 API 密钥、没有数据库密码、没有 Stripe 令牌。这就是”克隆生产环境,万无一失”真正奏效的原因。你的沙盒无法向真实客户收费,因为它无法伪装成你。我们会在管理密钥教程中正式设置这一机制。
验证隔离性
并排列出两个仓库:
rdc repo list -m <machine-name> 两个 repo 现在作为两个完全独立的环境共存于同一台机器和磁盘上。
你会看到 my-app 和 my-app:experiment 同时运行。在原始仓库中,标记文件还在你留下它的地方:
rdc term connect -m <machine-name> --repository my-app --command 'ls -la index.html' 通过检查原始 repo 验证隔离性:标记文件仍在原位。创建 fork 不会修改父级。
现在在 fork 内进行一次破坏性操作:
rdc term connect -m <machine-name> --repository my-app:experiment --command 'rm index.html && echo removed' 仅在 fork 内部删除标记文件。这是一个仅限于 fork 范围的破坏性操作。
跳回原始仓库并检查:
rdc term connect -m <machine-name> --repository my-app --command 'ls -la index.html' 切换回原始 repo:标记文件保持完好。父级和 fork 共享相同的镜像,但运行在各自独立的 Docker daemon 和独立的文件系统上。
标记文件仍然在这里,完好无损。fork 的变更留在了 fork 里。相同的镜像,独立的 Docker 守护进程,独立的文件系统。
清理
完成后,直接删除 fork:
rdc repo delete --name my-app:experiment -m <machine-name> 完成后删除 fork。原始 repo 不受影响,实现安全的 fork、实验和丢弃工作流。
原始仓库保持原样。Fork、实验、破坏、删除。 零风险。
下一篇:Fork 隔离实战。