Форк репозитория
Форкируйте целую продакшен-среду (приложение, базу данных, конфигурационные файлы) за секунды. Любой размер. Без лишнего места на диске. Форкируйте столько раз, сколько хотите.
Девиз: клонируй продакшен, ничего не сломай.
Смотреть урок
Создайте что-то, что можно потерять
Сначала создадим файл в работающем приложении, чтобы доказать изоляцию форка. Откройте репозиторий в VS Code, затем внутри репозитория создайте файл-маркер:
rdc vscode connect -m my-server -r my-app
echo "Hello from production" > index.html
Теперь сделаем форк.
Форк
rdc repo fork --parent my-app -m <machine-name> --tag experiment --up Одна команда клонирует весь repo: приложение, базу данных и конфигурационные файлы. Время fork постоянно и не зависит от размера repo, будь то один гигабайт, сто гигабайт или один терабайт.
Одна команда. Всё склонировалось (приложение, база данных, конфигурационные файлы) и произошло это за секунды. Запустите снова, и получите ещё один независимый клон.
Почему так быстро?
Всё дело в btrfs reflinks. При форке создаётся новое дерево файловой системы, указывающее на те же блоки данных, что и родитель. При форке данные не копируются. Всё это просто метаданные, поэтому размер родителя никогда не влияет на скорость форка.
Форк работает так же. 1 ГБ, 100 ГБ, 1 ТБ. Одно время, каждый раз.
Что общее, а что ваше
Думайте о родительском репозитории как о неподвижном источнике. Ваш форк представляет собой copy-on-write-представление этого источника. Запишите что-то в форк, и эти записи останутся в форке. Родитель не меняется, сколько бы форков ни указывало на него.
Солнце не удержать, но можно удержать его отражение в зеркале.
Что будет, если родитель изменится?
Теперь представьте снимок. Когда вы форкаете, вы замораживаете родителя в этот точный момент. Родитель продолжает изменяться. Ваш форк нет.
Если родительский репозиторий изменится позже, ваш форк останется там, где был.
Реку не удержать, но можно удержать её снимок на фотографии.
Место на диске остаётся неизменным
Вот почему диск не переполняется. Пять форков репозитория объёмом 100 ГБ? Всё равно около 100 ГБ суммарно. Вы платите дисковым пространством только за то, что изменяете в каждом форке.
Форкайте хоть пять раз. Диск даже не заметит.
Что форки не наследуют: секреты
Есть одна вещь, которую форк намеренно не копирует: секреты. Форк стартует без 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 не изменяет родительский repo.
Теперь внесите деструктивное изменение, но только в форке:
rdc term connect -m <machine-name> --repository my-app:experiment --command 'rm index.html && echo removed' Удалите маркерный файл только внутри fork. Это деструктивное изменение, ограниченное scope fork.
Вернитесь в оригинал и проверьте:
rdc term connect -m <machine-name> --repository my-app --command 'ls -la index.html' Вернитесь к исходному repo: маркерный файл остался нетронутым. Родительский repo и fork используют один образ, но работают на отдельных Docker daemon и отдельных файловых системах.
Файл-маркер здесь, нетронутый. Изменения форка остались в форке. Одни и те же образы, отдельные Docker-демоны, отдельные файловые системы.
Очистка
Когда закончите, просто удалите форк:
rdc repo delete --name my-app:experiment -m <machine-name> Удалите fork по завершении. Исходный repo не затрагивается, что обеспечивает безопасный рабочий процесс: fork, эксперимент, удаление.
Оригинал остаётся в точности таким, каким был. Форк, эксперимент, сломал, удалил. Никакого риска.
Далее: Изоляция форка в действии.