Форк репозитория
Это ключевая возможность: клонировать целую продакшен-среду (приложение, базу данных, конфигурационные файлы) за секунды. Любой размер. Без лишнего места на диске. Форкайте сколько угодно раз.
Девиз: клонируй продакшен, ничего не сломай.
Смотреть урок
Создайте что-то, что можно потерять
Сначала создадим файл в работающем приложении, чтобы доказать изоляцию форка. Откройте репозиторий в VS Code:
rdc vscode connect -m my-server -r my-app
Внутри репозитория создайте файл-маркер:
time echo "Hello from production" > index.html
Теперь сделаем форк.
Форк
time rdc repo fork --parent my-app -m my-server --tag experiment --up
Одна команда. Всё склонировалось (приложение, база данных, конфигурационные файлы) и произошло это за секунды. Запустите снова, и получите ещё один независимый клон.
Почему так быстро?
Представьте, что вы делитесь ссылкой на папку. Ссылка одинакова, маленькая папка или огромная. Папка тяжёлая, ссылка лёгкая.
Форк работает так же. 1 ГБ, 100 ГБ, 1 ТБ. Одно время, каждый раз.
Что общее, а что ваше
Думайте о родительском репозитории как о солнце. Солнце не удержать в руках, но можно держать зеркало, отражающее его. Это зеркало (ваш форк) остаётся вашим. Нарисуйте что-то на зеркале: ваши рисунки останутся вашими. Солнце не меняется, сколько бы зеркал ни смотрело на него.
Солнце не удержать, но можно удержать его отражение в зеркале.
Что будет, если родитель изменится?
Теперь представьте реку. Вода течёт. Каждый момент она другая. Когда вы форкаете, вы делаете фотографию реки, замёрзшей в этот момент. Река продолжает течь. Ваша фотография нет.
Если родительский репозиторий изменится позже, ваш форк останется там, где был.
Реку не удержать, но можно удержать её снимок на фотографии.
Место на диске остаётся неизменным
Вот почему диск не переполняется. Пять форков репозитория объёмом 100 ГБ? Всё равно около 100 ГБ суммарно. Вы платите дисковым пространством только за то, что изменяете в каждом форке.
Форкайте хоть пять раз. Диск даже не заметит.
Что форки не наследуют: секреты
Есть одна вещь, которую форк намеренно не копирует: секреты. Форк стартует без API-ключей, без паролей к базе данных, без токенов Stripe. Именно поэтому «клонируй продакшен, ничего не сломай» действительно работает. Ваша песочница не может выставлять счета реальным клиентам, потому что не может притворяться вами. Подробнее мы разберём это в уроке Управление секретами.
Проверка изоляции
Выведите оба репозитория рядом:
time rdc repo list -m my-server
Вы увидите my-app и my-app:experiment, работающие одновременно.
В оригинальном репозитории проверьте, что запущено:
time docker ps
Обратите внимание на время работы. Это оригинальные контейнеры. Теперь переключитесь на форк:
rdc vscode connect -m my-server -r my-app:experiment
time docker ps
Те же образы, но время работы свежее. Контейнеры запустились вместе с форком.
Сделаем разницу ещё очевиднее. Добавим контейнер только в форк:
time docker run --rm -it -d nginx
time docker ps
Nginx запущен, но только внутри этого форка.
Попробуйте что-то деструктивное:
time rm index.html
Здесь файла нет. Вернёмся в оригинал:
rdc vscode connect -m my-server -r my-app
time docker ps
Никакого nginx. Контейнеры форка остались в форке. И index.html здесь на месте, нетронутый. Оригинал ничего не знал о происходившем. Одни и те же образы, отдельные Docker-демоны, отдельные файловые системы.
Очистка
Когда закончите, просто удалите форк:
time rdc repo delete --name my-app:experiment -m my-server
Оригинал остаётся в точности таким, каким был. Форк, эксперимент, сломал, удалил. Никакого риска.
Далее: Управление секретами.