リポジトリをフォークする
これが目玉機能です。本番環境全体(アプリ、データベース、設定ファイル)を数秒でクローンできます。サイズ制限なし、追加ディスク不要、何度でもフォークできます。
キャッチフレーズ: 本番をクローンして、何も壊さない。
チュートリアル動画
失うものを用意する
まず、フォークの分離を証明するためにファイルを追加します。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つです。すべて(アプリ、データベース、設定ファイル)を数秒でクローンしました。もう一度実行すれば、また別の独立したクローンが作成されます。
なぜこんなに速いのか
フォルダのリンクを共有することを想像してください。フォルダが小さくても大きくても、リンクは同じです。フォルダは重くても、リンクは軽いのです。
フォークも同じ仕組みです。1 GB、100 GB、1 TB。常に同じ時間がかかります。
共有されるものと、自分のもの
親リポジトリを太陽だと考えてください。太陽を手で持つことはできませんが、太陽を映す鏡を持つことはできます。その鏡があなたのフォークです。鏡に絵を描けば、その絵はあなたのものです。何枚鏡を向けても、太陽は変わりません。
太陽は持てないけれど、鏡の中に持てる。
親がその後変わったら?
今度は川を想像してください。水は流れ続けます。毎瞬間、姿が変わります。フォークするとき、あなたはその瞬間の川の写真を撮ります。川は流れ続けますが、写真は変わりません。
親リポジトリがその後変わっても、あなたのフォークはフォークした時点のまま残ります。
川は持てないけれど、写真の中に持てる。
ディスク使用量は増えない
だからディスクが溢れないのです。100 GB のリポジトリを5つフォークしても、合計はまだ約 100 GB です。各フォークで変更した分だけディスクが使われます。
何度でもフォークしてください。ディスクは気づきもしません。
フォークが引き継がないもの: シークレット
フォークが意図的に引き継がないものが1つあります。シークレットです。フォークは 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
元のリポジトリはまったく変わりません。フォークして、実験して、壊して、削除する。 リスクゼロです。
次: シークレットの管理