次の方法で共有


ボリュームまたはバインド マウント .NET.NET Aspire 使用してプロジェクト データを保持する

.NET .NET Aspire プロジェクトを開始および停止するたびに、アプリはアプリ リソース コンテナーも作成および破棄します。 デバッグ セッション中にこれらのコンテナーに格納されているデータまたはファイルは、後続のセッションでは失われます。 多くの開発チームは、たとえば、実行ごとにサンプル データをデータベースに再作成する必要がないように、デバッグ セッション間でこのデータを保持することを好みます。

この記事では、アプリの起動時にデータを保持するように .NET.NET Aspire プロジェクトを構成する方法について説明します。 ローカル開発中の継続的なデータ セットは、多くのシナリオで役立ちます。 PostgreSQL、Redis、Azure Storage など、さまざまな.NET Aspireリソース コンテナーの種類でボリュームとバインド マウントを利用できます。

プロジェクト データを保持するタイミング

データベース リソースを含む .NET.NET Aspire ソリューションがあるとします。 既定では、データはそのリソースのコンテナーに保存されます。 アプリを停止するとすべてのリソース コンテナーが破棄されるため、そのデータは失われ、次回ソリューションを実行したときには表示されません。 このセットアップでは、テストまたはデバッグのためにアプリの起動間にデータベースまたはストレージ サービスにデータを保持する場合に問題が発生します。 たとえば、次のようなことをしてみてください。

  • 複数の再起動にわたる拡張開発セッション中に、データベース内の継続的なデータ セットを操作します。
  • Azure Blob Storage エミュレーターで変更されるファイル セットをテストまたはデバッグします。
  • アプリの起動間で、キャッシュされたデータまたはメッセージを Redis インスタンスに保持します。

ボリュームまたはバインド マウントを使用して、これらの目標を達成できます。 これらのオブジェクトは、コンテナーの外部にあるデータをコンテナー ホスト上のディレクトリに格納するため、コンテナーで破棄されません。 この方法では、 .NET.NET Aspire プロジェクトの起動間にデータを保持するサービスを決定します。

ボリュームとバインド マウントは、コンテナー ランタイムの機能 ( Docker または Podman) です。 .NET .NET Aspire には、これらの機能を簡単に操作できるようにするメソッドが含まれています。

ボリュームとバインド マウントを比較する

ボリュームとバインド マウントの両方で、コンテナー ホスト上のディレクトリにデータが格納されます。 このディレクトリはコンテナーの外部にあるため、コンテナーが停止してもデータは破棄されません。 ただし、ボリュームとバインド マウントの動作は異なります。

  • ボリューム: コンテナー ランタイムは、ボリュームを作成および制御します。 ボリュームは、コンテナー ホストのコア機能から分離されます。
  • バインド マウント: コンテナー ランタイムは、ホスト コンピューターにファイルまたはディレクトリをマウントします。 コンテナーとホスト マシンの両方が、バインド マウントの内容にアクセスできます。

ボリュームは、バインドマウントよりも安全で移植性が高いです。 また、パフォーマンスも向上し、可能な限り使用する必要があります。 バインド マウントは、ホスト コンピューターからデータにアクセスまたは変更する必要がある場合にのみ使用します。

ボリュームを使用する

ボリュームは、コンテナーによって生成されたデータを保持するための推奨される方法であり、Windows と Linuxの両方でサポートされています。 ボリュームは、一度に複数のコンテナーのデータを格納し、高いパフォーマンスを提供し、バックアップや移行が簡単です。 .NET .NET Aspireでは、次の 3 つのパラメーターを受け取る ContainerResourceBuilderExtensions.WithVolume メソッドを使用して、各リソース コンテナーのボリュームを構成します。

  • name: ボリュームのオプションの名前。
  • target: 保持するデータのコンテナー内のターゲット パス。
  • isReadOnly: ボリューム内のデータを変更できるかどうかを示すブール型フラグ。 既定値は false です。

この記事の残りの部分では、分散アプリ ビルダー ビットが既に定義されている .NET.NET Aspireapp ホスト プロジェクトProgram クラスを調べることを想像してください。

var builder = DistributedApplication.CreateBuilder(args);

// TODO:
//   Consider various code snippets for configuring 
//   volumes here and persistent passwords.

builder.Build().Run();

考慮すべき最初のコード スニペットでは、ContainerResourceBuilderExtensions.WithVolume API を使用して、SQL Server リソースのボリュームを構成します。 次のコードは、SQL Server アプリ ホスト プロジェクトで .NET Aspire リソースのボリュームを構成する方法を示しています。

var sql = builder.AddSqlServer("sql")
                 .WithVolume(target: "/var/opt/mssql")
                 .AddDatabase("sqldb");

この例では、 /var/opt/mssql コンテナー内のデータベース ファイルへのパスを設定します。

すべての .NET.NET Aspire コンテナー リソースはボリュームを利用でき、一部のリソースから派生した名前付きボリュームを追加するための便利な API が提供されます。 WithDataVolumeメソッドを例として使用すると、次のコードは機能的には前の例と同等ですが、より簡潔です。

var sql = builder.AddSqlServer("sql")
                 .WithDataVolume()
                 .AddDatabase("sqldb");

VolumeMount.AppHostという名前のアプリ ホスト プロジェクトでは、WithDataVolume メソッドによって名前付きボリュームが VolumeMount.AppHost-sql-data として自動的に作成され、/var/opt/mssql コンテナー内の SQL Server パスにマウントされます。 名前付け規則は次のとおりです。

  • {appHostProjectName}-{resourceName}-data: ボリューム名は、アプリ ホスト プロジェクト名とリソース名から派生します。

バインド マウントを活用する

バインド マウントを使用すると、コンテナー内とホスト コンピューター上のプロセスの両方からデータにアクセスできます。 たとえば、バインド マウントが確立されたら、ホスト コンピューター上のファイルをコピーできます。 その後、ファイルは、リソースのコンテナー内のバインドされたパスで使用できます。 .NET .NET Aspireでは、次の 3 つのパラメーターを受け取る WithBindMount メソッドを使用して、各リソース コンテナーのバインド マウントを構成します。

  • source: コンテナーにマウントするホスト コンピューター上のフォルダーへのパス。
  • target: フォルダーのコンテナー内のターゲット パス。
  • isReadOnly: バインド マウント内のデータを変更できるかどうかを示すブール型フラグ。 既定値は false です。

WithBindMount API を使用して、SQL Server リソースのバインド マウントを構成する次のコード スニペットを考えてみましょう。

var sql = builder.AddSqlServer("sql")
                 .WithBindMount(source: @"C:\SqlServer\Data", target: "/var/opt/mssql")
                 .AddDatabase("sqldb");

この例では、次の操作を行います。

  • source: @"C:\SqlServer\Data" は、バインドされるホスト コンピューター上のフォルダーを設定します。
  • target: "/var/opt/mssql" コンテナー内のデータベース ファイルへのパスを設定します。

ボリュームに関しては、一部の .NET.NET Aspire コンテナー リソースは、バインド マウントを追加するための便利な API を提供します。 WithDataBindMountメソッドを例として使用すると、次のコードは機能的には前の例と同等ですが、より簡潔です。

var sql = builder.AddSqlServer("sql")
                 .WithDataBindMount(source: @"C:\SqlServer\Data")
                 .AddDatabase("sqldb");

永続的なパスワードを作成する

名前付きボリュームでは、アプリの起動間に一貫したパスワードが必要です。 .NET .NET Aspire は、ランダムなパスワード生成機能を便利に提供します。 パスワードが自動的に生成される前の例をもう一度考えてみましょう。

var sql = builder.AddSqlServer("sql")
                 .WithDataVolume()
                 .AddDatabase("sqldb");

password パラメーターは AddSqlServerを呼び出すときには指定されないため、.NET AspireSQL Server リソースのパスワードが自動的に生成されます。

大事な

これは永続的なパスワードではありません。 代わりに、アプリ ホストが実行されるたびに変更されます。

永続的な パスワードを作成するには、生成されたパスワードをオーバーライドする必要があります。 これを行うには、アプリ ホスト プロジェクト ディレクトリで次のコマンドを実行して、.NET ユーザー シークレットにローカル パスワードを設定します。

dotnet user-secrets set Parameters:sql-password <password>

これらのシークレットの名前付け規則を理解しておくことが重要です。 パスワードは、Parameters:sql-password キーを使用して構成に格納されます。 名前付け規則は、次のパターンに従います。

  • Parameters:{resourceName}-password: SQL Server リソース ("sql"という名前) の場合、パスワードはキー Parameters:sql-passwordを使用して構成に格納されます。

次の表に示すような、他のサーバー ベースのリソースの種類にも同じパターンが適用されます。

リソースの種類 ホスティング パッケージ リソース名の例 オーバーライドキー
MySQL 📦 Aspire.Hosting.MySql mysql Parameters:mysql-password
Oracle 📦 Aspire.ホスティング。Oracle oracle Parameters:oracle-password
PostgreSQL 📦 Aspire.ホスティング。PostgreSQL postgresql Parameters:postgresql-password
RabbitMQ 📦 Aspire.Hosting.RabbitMq rabbitmq Parameters:rabbitmq-password
SQL Server 📦 Aspire.Hosting.SqlServer sql Parameters:sql-password

生成されたパスワードをオーバーライドすることで、アプリの起動間でパスワードの一貫性を保つことができます。 別の方法として、AddParameter メソッドを使用して、パスワードとして使用できるパラメーターを作成します。 次のコードは、SQL Server リソースの永続的なパスワードを作成する方法を示しています。

var sqlPassword = builder.AddParameter("sql-password", secret: true);

var sql = builder.AddSqlServer("sql", password: sqlPassword)
                 .WithDataVolume()
                 .AddDatabase("sqldb");

AddParameter メソッドは、シークレットと見なされる sql-password という名前のパラメーターを作成するために使用されます。 AddSqlServer メソッドは、password パラメーターを使用して呼び出され、SQL Server リソースのパスワードを設定します。 詳細については、「外部パラメーターを参照してください。

次の手順

前のコードのボリュームの概念をさまざまなサービスに適用できます。これには、アプリの起動時に保持されるデータを含むデータベースのシード処理が含まれます。 これらの手法と、次のチュートリアルで示されているリソース実装を組み合わせてみます。