コンテナイメージスキル
このスキルは、microsoft/aspire 製品リポジトリからすべてのコンテナイメージ参照を抽出し、構造化された JSON ファイルを microsoft/aspire.dev の以下のパスに書き込みます:
src/frontend/src/data/container-images.json
この JSON は aspire.dev サイト上の Astro コンポーネントによって消費され、Aspire ホスティング統合で使用されるすべてのコンテナイメージのブラウズ可能なカタログをレンダリングします。
ソースコードパターン
microsoft/aspire 内のすべてのコンテナイメージメタデータは、*ContainerImageTags(または *ContainerImageTags.cs)という名前の静的クラスに存在します。各ファイルは厳格で一貫したパターンに従います:
internal static class <Name>ContainerImageTags
{
public const string Registry = "<registry-host>";
public const string Image = "<image-path>";
public const string Tag = "<tag>";
// 一部のファイルには追加のコンパニオンイメージがあります。例:
public const string <Companion>Registry = "<registry-host>";
public const string <Companion>Image = "<image-path>";
public const string <Companion>Tag = "<tag>";
}
ファイルの場所
以下の glob パターンに一致するすべてのファイル:
src/**/ContainerImageTags.cs
src/**/*ContainerImageTags.cs
これらは多くのプロジェクトにまたがって存在します(以下は一部):
| プロジェクト | ファイル |
|---|---|
Aspire.Hosting.Redis | RedisContainerImageTags.cs |
Aspire.Hosting.PostgreSQL | PostgresContainerImageTags.cs |
Aspire.Hosting.SqlServer | SqlServerContainerImageTags.cs |
Aspire.Hosting.MongoDB | MongoDBContainerImageTags.cs |
Aspire.Hosting.MySql | MySqlContainerImageTags.cs |
Aspire.Hosting.Kafka | KafkaContainerImageTags.cs |
Aspire.Hosting.RabbitMQ | RabbitMQContainerImageTags.cs |
Aspire.Hosting.Nats | NatsContainerImageTags.cs |
Aspire.Hosting.Garnet | GarnetContainerImageTags.cs |
Aspire.Hosting.Valkey | ValkeyContainerImageTags.cs |
Aspire.Hosting.Seq | SeqContainerImageTags.cs |
Aspire.Hosting.Qdrant | QdrantContainerImageTags.cs |
Aspire.Hosting.Keycloak | KeycloakContainerImageTags.cs |
Aspire.Hosting.Oracle | OracleContainerImageTags.cs |
Aspire.Hosting.Milvus | MilvusContainerImageTags.cs |
Aspire.Hosting.Elasticsearch | ElasticsearchContainerImageTags.cs |
Aspire.Hosting.Yarp | YarpContainerImageTags.cs |
Aspire.Hosting.Azure.Storage | StorageEmulatorContainerImageTags.cs |
Aspire.Hosting.Azure.CosmosDB | CosmosDBEmulatorContainerImageTags.cs |
Aspire.Hosting.Azure.ServiceBus | ServiceBusEmulatorContainerImageTags.cs |
Aspire.Hosting.Azure.EventHubs | EventHubsEmulatorContainerImageTags.cs |
Aspire.Hosting.Azure.SignalR | SignalREmulatorContainerImageTags.cs |
Aspire.Hosting.Azure.AppConfiguration | AppConfigurationEmulatorContainerImageTags.cs |
Aspire.Hosting.Azure.Functions | DurableTaskSchedulerEmulatorContainerImageTags.cs |
Aspire.Hosting.Azure.Kusto | AzureKustoEmulatorContainerImageTags.cs |
重要: 新しいホスティングパッケージはいつでも追加される可能性があります。常にファイルを動的に検出し、ハードコードされたリストに依存しないでください。
抽出手順
ステップ 1 — aspire リポジトリを HEAD でクローンまたはアクセス
# ローカルで作業する場合:
git clone --depth 1 https://github.com/microsoft/aspire.git /tmp/aspire
ステップ 2 — すべての ContainerImageTags ファイルを検索
find /tmp/aspire/src -name '*ContainerImageTags.cs' -type f
ステップ 3 — 各ファイルを解析
各ファイルについて、すべてのイメージグループを抽出します。単一のファイルで複数のイメージ(プライマリ + コンパニオン)を定義できます。解析ルールは以下の通りです:
- プライマリイメージ: フィールド名が正確に
Registry、Image、Tagであるもの。 - コンパニオンイメージ: 接頭辞を持つフィールド(例:
PgAdminRegistry、PgAdminImage、PgAdminTag)。これらを共通の接頭辞でグループ化します。 - 代替タグ:
TagVNextPreview、ManagementTagのようなフィールド。これらを同じイメージの追加タグバリアントとして含めます。 - 静的プロパティ vs const フィールド: ほとんどは
public const stringですが、一部(例: Kusto)はpublic static string { get; }を使用します。両方に対応してください。 - 計算されたタグ: 一部のタグは計算されます(例:
public const string ManagementTag = $"{Tag}-management";)。これらをリテラル値に解決してください。 aspirePackageを導出: プロジェクトディレクトリ名から(例:src/Aspire.Hosting.Redis/→Aspire.Hosting.Redis)。sourceFileを導出: リポジトリルートからの相対パス。
ステップ 4 — JSON を構築
出力配列の各エントリは、1 つの異なるコンテナイメージを表します:
[
{
"aspirePackage": "Aspire.Hosting.Redis",
"name": "Redis",
"registry": "docker.io",
"image": "library/redis",
"tag": "8.6",
"fullImage": "docker.io/library/redis:8.6",
"sourceFile": "src/Aspire.Hosting.Redis/RedisContainerImageTags.cs",
"sourceUrl": "https://github.com/microsoft/aspire/blob/main/src/Aspire.Hosting.Redis/RedisContainerImageTags.cs",
"isCompanion": false,
"companionOf": null,
"alternateTags": []
},
{
"aspirePackage": "Aspire.Hosting.Redis",
"name": "Redis Commander",
"registry": "docker.io",
"image": "rediscommander/redis-commander",
"tag": "latest",
"fullImage": "docker.io/rediscommander/redis-commander:latest",
"sourceFile": "src/Aspire.Hosting.Redis/RedisContainerImageTags.cs",
"sourceUrl": "https://github.com/microsoft/aspire/blob/main/src/Aspire.Hosting.Redis/RedisContainerImageTags.cs",
"isCompanion": true,
"companionOf": "Redis",
"alternateTags": []
},
{
"aspirePackage": "Aspire.Hosting.Azure.CosmosDB",
"name": "CosmosDB Emulator",
"registry": "mcr.microsoft.com",
"image": "cosmosdb/linux/azure-cosmos-emulator",
"tag": "stable",
"fullImage": "mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:stable",
"sourceFile": "src/Aspire.Hosting.Azure.CosmosDB/CosmosDBEmulatorContainerImageTags.cs",
"sourceUrl": "https://github.com/microsoft/aspire/blob/main/src/Aspire.Hosting.Azure.CosmosDB/CosmosDBEmulatorContainerImageTags.cs",
"isCompanion": false,
"companionOf": null,
"alternateTags": ["vnext-preview"]
}
]
フィールド定義
| フィールド | 型 | 説明 |
|---|---|---|
aspirePackage | string | NuGet パッケージ/プロジェクト名(src/ 下のディレクトリ名) |
name | string | 人間にわかりやすい名前。プライマリイメージの場合は、クラス名から導出します(ContainerImageTags / EmulatorContainerImageTags のサフィックスを削除し、PascalCase を分割)。コンパニオンイメージの場合は、クラス名だけでなく、コンパニオンの接頭辞/タイプ(例: PgAdmin*、RedisCommander*)から導出します。 |
registry | string | コンテナレジストリホスト(例: docker.io、mcr.microsoft.com、ghcr.io、quay.io、container-registry.oracle.com) |
image | string | レジストリ内のイメージパス |
tag | string | プライマリタグ |
fullImage | string | 完全修飾イメージ参照: {registry}/{image}:{tag} |
sourceFile | string | microsoft/aspire 内のソースファイルへの相対パス |
sourceUrl | string | main ブランチ上のソースファイルへの GitHub パーマリンク |
isCompanion | boolean | これがコンパニオン/ツールイメージ(例: pgAdmin、Kafka UI、phpMyAdmin)の場合は true |
companionOf | string? | このイメージが付属するプライマリイメージの名前。ない場合は null |
alternateTags | string[] | このイメージに対して定義された追加のタグ定数(例: vnext-preview、management) |
ステップ 5 — 並べ替えて書き込み
配列を aspirePackage(昇順)、次に isCompanion(プライマリが先)、次に name(昇順)で並べ替えます。
書き込み先: src/frontend/src/data/container-images.json
検証チェックリスト
ファイル生成後、以下を確認してください:
-
src/内のすべての*ContainerImageTags.csファイルが表現されている - 重複エントリがない(同じ
registry+image+tag+aspirePackage) - すべての
fullImage値が適切な形式である(registry/image:tag) - コンパニオンイメージが正しくプライマリにリンクされている
- JSON が有効で適切にフォーマットされている(インデント 2 スペース)
- 上記のルールに従ってファイルが並べ替えられている
Astro でのデータ消費
src/frontend/src/data/container-images.json の JSON ファイルは、Astro コンポーネントで直接インポートできます:
import containerImages from '../data/container-images.json';
これは、同じディレクトリにある aspire-integrations.json、samples.json、github-stats.json などの既存のデータファイルと同じパターンに従います。
関連コンテンツへのリンク
各コンテナイメージエントリは、以下と相互参照できます:
- 統合ドキュメント:
src/frontend/src/data/integration-docs.json(aspirePackageで一致) - NuGet 統合:
src/frontend/src/data/aspire-integrations.json(title≈aspirePackageで一致) - ソースファイル: コントリビューター向けの
microsoft/aspireへのリンク
重要なルール
- 常にファイルを動的に検出 — 新しいホスティングパッケージが頻繁に追加されます。
constとstaticプロパティパターンの両方を解析 — コードベースに両方存在します。- 計算されたタグ値の文字列補間を解決(例:
$"""{Tag}-management""")。 - 開発コンテナイメージ、テスト専用イメージ、または
playground/ディレクトリのイメージを含めない。 src/ディレクトリ内の*ContainerImageTags.csに一致するファイルのみを抽出。- aspire.dev リポジトリは Astro サイトです — データファイルは、コンポーネントで消費される他の JSON データとともに配置されます。