.NET SDK コンテナーの作成の概要
Dockerfile を使用して .NET アプリをコンテナー化することは可能ですが、.NET SDK を使用してアプリを直接コンテナー化するべき強力な理由があります。 この記事では、.NET SDK コンテナー作成機能の概要と、テレメトリ、発行に関する考慮事項、ビルド プロパティ、コンテナー レジストリへの認証に関連する詳細について説明します。
プロジェクト出版に関する考慮事項
これで .NET アプリが作成されたので、コンテナーとして発行できます。 その前に、注意すべき重要な考慮事項がいくつかあります。 .NET SDK バージョン 8.0.200 より前のバージョンでは、NuGet パッケージ Microsoft.NET.Build.Containers
.NET アプリをコンテナーとして発行できるようにするには、次のビルド プロパティが必要です。
IsPublishable
:true
に設定します。 このプロパティは、console
、webapp
、worker
など、実行可能なプロジェクトの種類のtrue
に暗黙的に設定されます。EnableSdkContainerSupport
: プロジェクトの種類がコンソール アプリの場合にtrue
に設定します。
SDK コンテナーのサポートを明示的に有効にするには、次のプロジェクト ファイル スニペットを検討してください。
<PropertyGroup>
<IsPublishable>true</IsPublishable>
<EnableSdkContainerSupport>true</EnableSdkContainerSupport>
</PropertyGroup>
スイッチとビルドのプロパティを公開する
すべての .NET CLI コマンドと同様に、コマンド ラインで MSBuild プロパティ
/p:PropertyName=Value
-p:PropertyName=Value
-p PropertyName=Value
--property PropertyName=Value
任意の構文を自由に使用できますが、ドキュメントには -p
形式の使用例が示されています。
ヒント
トラブルシューティングを行うには、MSBuid ログの使用を検討してください。 バイナリ ログ (binlog) ファイルを生成するには、-bl
スイッチを dotnet publish
コマンドに追加します。 Binlog ファイルはビルドの問題を診断するのに役立ち、MSBuild 構造化ログ ビューアーで開くことができます。 MSBuild 分析に不可欠なビルド プロセスの詳細なトレースが提供されます。 詳細については、「MSBuildのログのトラブルシューティングと作成」を参照してください。
プロファイルとターゲットを発行する
dotnet publish
を使用する場合、-p PublishProfile=DefaultContainer
でプロファイルを指定すると、SDK が発行プロセスの後に別のターゲットをトリガーするプロパティを設定できます。 これは、目的の結果を達成するための間接的な方法です。 一方、dotnet publish /t:PublishContainer
を使用すると、PublishContainer
ターゲットが直接呼び出され、同じ結果が得られますが、より簡単な方法で実現されます。
つまり、次の .NET CLI コマンドです。
dotnet publish -p PublishProfile=DefaultContainer
PublishProfile
プロパティを DefaultContainer
に設定するコマンドは、次のコマンドと同じです。
dotnet publish /t:PublishContainer
2 つのメソッドの違いは、前者がプロファイルを使用してプロパティを設定し、後者がターゲットを直接呼び出す点です。 これが重要な理由は、プロファイルは MSBuild の機能であり、単に直接設定するよりも複雑な方法でプロパティを設定するために使用できることです。
1 つの重要な問題は、すべてのプロジェクトの種類がプロファイルをサポートしているわけではないか、同じプロファイル セットを使用できるわけではないということです。 さらに、Visual Studio や .NET CLI など、さまざまなツール間のプロファイルのサポート レベルに違いがあります。 そのため、ターゲットの使用は、一般に、同じ結果を得るためにより明確で広くサポートされている方法です。
コンテナー レジストリに対する認証
プライベート コンテナー レジストリを操作するには、これらのレジストリを使用して認証する必要があります。
Docker には、docker login
コマンドを使用してこれを使用する確立されたパターンがあります。これは、特定のレジストリで認証するための規則を含む Docker 構成ファイルと対話する方法です。 このファイルとエンコードする認証の種類は、レジストリ認証のために Microsoft.Net.Build.Containers でサポートされています。 これにより、このパッケージは、docker pull
および docker push
が可能なすべてのレジストリでシームレスに動作することが保証されます。 通常、このファイルは ~/.docker/config.json
認証の種類
config.json ファイルには、次の 3 種類の認証が含まれています。
明示的なユーザー名/パスワード
config.json ファイルの auths
セクションは、レジストリ名と Base64 でエンコードされた username:password 文字列の間のキー/値マップです。 一般的な Docker シナリオでは、docker login <registry> -u <username> -p <password>
実行すると、このマップに新しい項目が作成されます。 これらの資格情報は、継続的インテグレーション (CI) システムで一般的であり、ログインは実行の開始時にトークンによって行われます。 ただし、ファイルに資格情報が必要な場合のセキュリティ 上のリスクがあるため、エンド ユーザーの開発マシンではあまり人気が高くはありません。
資格情報ヘルパー
config.json ファイルの credHelpers
セクションは、レジストリ名と、そのレジストリの資格情報の作成と取得に使用できる特定のプログラムの名前の間のキー/値マップです。 これは、特定のレジストリに複雑な認証要件がある場合によく使用されます。 この種の認証を機能させるには、システムの PATH
に docker-credential-{name}
という名前のアプリケーションが必要です。 このような資格情報はセキュリティで保護される傾向がありますが、開発または CI マシンでは設定が困難な場合があります。
システム キーチェーン
credsStore
セクションは、システムのパスワード マネージャーとのインターフェイス方法を認識する Docker 資格情報ヘルパー プログラムの名前を値とする単一の文字列プロパティです。 Windows の場合、これは例えば wincred
かもしれません。 これらは、macOS および Windows 用の Docker インストーラーで一般的です。
環境変数を使用した認証
一部のシナリオでは、上記で説明した標準的な Docker 認証メカニズムでは不十分です。 このツールには、レジストリに資格情報を提供するための追加のメカニズム (環境変数) があります。 環境変数を使用する場合、資格情報の提供メカニズムはまったく使用されません。 次の環境変数がサポートされています。
DOTNET_CONTAINER_REGISTRY_UNAME
: これはレジストリのユーザー名である必要があります。 レジストリのパスワードがトークンの場合は、ユーザー名を"<token>"
する必要があります。DOTNET_CONTAINER_REGISTRY_PWORD
: これはレジストリのパスワードまたはトークンである必要があります。
手記
.NET SDK 8.0.400 の時点で、コンテナー操作の環境変数が更新されました。 SDK_CONTAINER_*
変数の前に DOTNET_CONTAINER_*
が付きます。
このメカニズムは資格情報の漏洩に対して脆弱になる可能性があるため、他のメカニズムが使用できないシナリオでのみ使用する必要があります。 たとえば、Docker コンテナー自体内で SDK コンテナー ツールを使用している場合です。 さらに、このメカニズムは名前空間が設定されていません。これは、ソース レジストリ (基本イメージがある場所) と の移行先 レジストリ (最終的なイメージをプッシュする場所) の両方に同じ資格情報を使用しようとします。
安全でないレジストリの使用
ほとんどのレジストリ アクセスはセキュリティで保護されていると見なされます。つまり、HTTPS はレジストリとの対話に使用されます。 ただし、すべてのレジストリが TLS 証明書を使用して構成されているわけではありません。特に、VPN の背後にあるプライベート企業レジストリのような状況です。 これらのユース ケースをサポートするために、コンテナー ツールは、特定のレジストリが安全でない通信を使用することを宣言する方法を提供します。
.NET 8.0.400 以降、SDK はこれらの構成ファイルと形式を認識し、その構成を自動的に使用して、HTTP と HTTPS のどちらを使用するかを判断します。 セキュリティで保護されていない通信用にレジストリを構成する方法は、選択したコンテナー ツールによって異なります。
Docker
Docker は、そのレジストリ構成を デーモン構成に格納します。 新しい安全でないレジストリを追加するために、新しいホストが "insecure-registries"
配列プロパティに追加されます。
{
"insecure-registries": [
"registry.mycorp.net"
]
}
手記
このファイルに変更を適用するには、Docker デーモンを再起動する必要があります。
Podman
Podman は、registries.conf
TOML ファイルを使用してレジストリ接続情報を格納します。 このファイルは通常、/etc/containers/registries.conf
に存在します。 新しい安全でないレジストリを追加するには、レジストリの設定を保持する TOML セクションが追加され、insecure
オプションを true
に設定する必要があります。
[[registry]]
location = "registry.mycorp.net"
insecure = true
手記
registries.conf ファイルに変更を適用するには、Podman を再起動する必要があります。
環境変数
9.0.100 以降、.NET SDK は、DOTNET_CONTAINER_INSECURE_REGISTRIES
環境変数を介して渡された安全でないレジストリを認識します。 この変数は、上記の Docker および Podman の例と同じ方法で安全でないものとして扱うために、ドメインのコンマ区切りのリストを受け取ります。
$Env:DOTNET_CONTAINER_INSECURE_REGISTRIES=localhost:5000,registry.mycorp.com; dotnet publish -t:PublishContainer -p:ContainerRegistry=registry.mycorp.com -p:ContainerBaseImage=localhost:5000/dotnet/runtime:9.0
テレメトリー
.NET アプリをコンテナーとして発行すると、.NET SDK コンテナー ツールによって、ツールの使用方法に関する使用状況テレメトリが収集されて送信されます。 収集されたデータは、.NET CLIによって送信される
収集されるテレメトリは、本質的に一般的であり、個人情報が漏えいしないことを目的としています。目的は、次の測定に役立ちます。
- .NET SDK コンテナー化機能の全体的な使用方法。
- 成功率と失敗率と、最も頻繁に発生するエラーの種類に関する一般的な情報。
- さまざまなレジストリの種類への発行や、発行の呼び出し方法など、テクノロジの特定の機能の使用。
テレメトリをオプトアウトするには、DOTNET_CLI_TELEMETRY_OPTOUT
環境変数を true
に設定します。 詳細については、.NET CLI テレメトリ
推論テレメトリ
基本イメージ推論プロセスの発生方法に関する次の情報がログに記録されます。
基準日 | 説明 | サンプル値 |
---|---|---|
InferencePerformed |
ユーザーがベース イメージを手動で指定する場合と、推論を使用している場合。 | true |
TargetFramework |
基本イメージ推論の実行時に選択された TargetFramework 。 |
net8.0 |
BaseImage |
選択した基本イメージの値。ただし、その基本イメージが Microsoft によって生成されたイメージの 1 つである場合に限ります。 mcr.microsoft.com で Microsoft が生成したイメージ以外のイメージをユーザーが指定した場合、この値は null になります。 | mcr.microsoft.com/dotnet/aspnet |
BaseImageTag |
選択したタグの値。ただし、そのタグが Microsoft が生成したイメージの 1 つを対象とする場合に限ります。 mcr.microsoft.com で Microsoft が生成したイメージ以外のイメージをユーザーが指定した場合、この値は null になります。 | 8.0 |
ContainerFamily |
ユーザーが ContainerFamily 機能を使用して基本イメージの 1 つの "フレーバー" を選択した場合の、ContainerFamily プロパティの値。 これは、ユーザーが Microsoft が生成した .NET イメージの 1 つを選択または推論した場合にのみ設定 mcr.microsoft.com |
jammy-chiseled |
ProjectType |
コンテナー化されているプロジェクトの種類。 | AspNetCore または Console |
PublishMode |
アプリケーションのパッケージ化方法。 | Aot 、Trimmed 、SelfContained 、または FrameworkDependent |
IsInvariant |
選択したイメージで不変のグローバリゼーションが必要な場合、またはユーザーが手動で選択した場合。 | true |
TargetRuntime |
このアプリケーションが公開されたときの RID(リリースID)。 | linux-x64 |
イメージ生成テレメトリ
コンテナーの作成と発行プロセスの発生方法に関する次の情報がログに記録されます。
日付ポイント | 説明 | サンプル値 |
---|---|---|
RemotePullType |
基本イメージがリモート レジストリから取得された場合、どのような種類のレジストリでしたか? | Azure、AWS、Google、GitHub、DockerHub、MRC、またはその他 |
LocalPullType |
基本イメージがコンテナー デーモンや tarball などのローカル ソースから取得された場合。 | Docker、Podman、Tarball |
RemotePushType |
イメージがリモート レジストリにプッシュされた場合、どのような種類のレジストリでしたか? | Azure、AWS、Google、GitHub、DockerHub、MRC、またはその他 |
LocalPushType |
ローカルの宛先にイメージがプッシュされた場合、その場所は? | Docker、Podman、Tarball |
さらに、プロセス中にさまざまな種類のエラーが発生した場合、そのエラーの種類に関するデータが収集されます。
日付ポイント | 説明 | サンプル値 |
---|---|---|
Error |
発生したエラーの種類 | unknown_repository 、credential_failure 、rid_mismatch 、local_load 。 |
Direction |
エラーが credential_failure の場合は、プッシュ レジストリまたはプル レジストリでしたか? |
push |
ターゲット RID | エラーが rid_mismatch の場合、要求された RID |
linux-x64 |
使用可能な RID | エラーが rid_mismatch の場合、基本イメージでサポートされていた RID は何ですか? |
linux-x64,linux-arm64 |
関連項目
- .NET アプリをコンテナーとして発行
- .NET アプリ参照 をコンテナー化する
.NET