Skill für Container-Images
Dieser Skill extrahiert jede Container-Image-Referenz aus dem Produkt-Repository microsoft/aspire und schreibt eine strukturierte JSON-Datei in das Repository microsoft/aspire.dev unter:
src/frontend/src/data/container-images.json
Diese JSON-Datei wird von Astro-Komponenten auf der aspire.dev-Seite genutzt, um einen durchsuchbaren Katalog aller Container-Images zu rendern, die von Aspire-Hosting-Integrationen verwendet werden.
Quellcode-Muster
Alle Container-Image-Metadaten in microsoft/aspire befinden sich in statischen Klassen namens *ContainerImageTags (oder *ContainerImageTags.cs). Jede Datei folgt einem strengen, einheitlichen Muster:
internal static class <Name>ContainerImageTags
{
public const string Registry = "<registry-host>";
public const string Image = "<image-path>";
public const string Tag = "<tag>";
// Manche Dateien haben zusätzliche Begleit-Images, z.B.:
public const string <Companion>Registry = "<registry-host>";
public const string <Companion>Image = "<image-path>";
public const string <Companion>Tag = "<tag>";
}
Wo sie zu finden sind
Alle Dateien, die auf das Glob-Muster passen:
src/**/ContainerImageTags.cs
src/**/*ContainerImageTags.cs
Diese verteilen sich über viele Projekte, darunter (aber nicht beschränkt auf):
| Projekt | Datei |
|---|---|
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 |
Wichtig: Neue Hosting-Pakete können jederzeit hinzugefügt werden. Entdecke Dateien immer dynamisch – verlasse dich niemals auf eine fest codierte Liste.
Extraktionsverfahren
Schritt 1 — Das Aspire-Repository auf HEAD klonen oder darauf zugreifen
# Falls lokal gearbeitet wird:
git clone --depth 1 https://github.com/microsoft/aspire.git /tmp/aspire
Schritt 2 — Alle ContainerImageTags-Dateien finden
find /tmp/aspire/src -name '*ContainerImageTags.cs' -type f
Schritt 3 — Jede Datei parsen
Extrahiere aus jeder Datei alle Image-Gruppen. Eine einzelne Datei kann mehrere Images definieren (primäre + Begleiter). Die Parsing-Regeln sind:
- Primäres Image: Felder, die genau
Registry,Image,Tagheißen. - Begleit-Images: Felder mit einem Präfix, z. B.
PgAdminRegistry,PgAdminImage,PgAdminTag– gruppiere sie nach dem gemeinsamen Präfix. - Alternative Tags: Felder wie
TagVNextPreview,ManagementTag– füge sie als zusätzliche Tag-Varianten zum selben Image hinzu. - Statische Eigenschaften vs. const-Felder: Die meisten verwenden
public const string, aber einige (z. B. Kusto) verwendenpublic static string { get; }. Behandle beide Fälle. - Berechnete Tags: Manche Tags werden berechnet, z. B.
public const string ManagementTag = $"{Tag}-management";– löse sie zu ihrem Literalwert auf. - Leite
aspirePackageaus dem Projektverzeichnisnamen ab (z. B.src/Aspire.Hosting.Redis/→Aspire.Hosting.Redis). - Leite
sourceFileals Pfad relativ zum Repository-Stammverzeichnis ab.
Schritt 4 — Das JSON erstellen
Jeder Eintrag im Ausgabe-Array repräsentiert ein bestimmtes Container-Image:
[
{
"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"]
}
]
Felddefinitionen
| Feld | Typ | Beschreibung |
|---|---|---|
aspirePackage | string | Der NuGet-Paket-/Projektname (Verzeichnisname unter src/) |
name | string | Benutzerfreundlicher Name. Leite ihn für primäre Images aus dem Klassennamen ab (entferne das ContainerImageTags- / EmulatorContainerImageTags-Suffix, trenne PascalCase). Leite ihn für Begleit-Images aus dem Begleitpräfix/-typ ab (z. B. PgAdmin*, RedisCommander*) anstatt nur aus dem Klassennamen. |
registry | string | Container-Registry-Host (z. B. docker.io, mcr.microsoft.com, ghcr.io, quay.io, container-registry.oracle.com) |
image | string | Image-Pfad innerhalb der Registry |
tag | string | Primärer Tag |
fullImage | string | Vollständig qualifizierte Image-Referenz: {registry}/{image}:{tag} |
sourceFile | string | Relativer Pfad zur Quelldatei in microsoft/aspire |
sourceUrl | string | GitHub-Permalink zur Quelldatei im main-Branch |
isCompanion | boolean | true, wenn es sich um ein Begleit-/Tooling-Image handelt (z. B. pgAdmin, Kafka UI, phpMyAdmin) |
companionOf | string? | Name des primären Images, das begleitet wird, oder null |
alternateTags | string[] | Alle zusätzlichen Tag-Konstanten, die für dieses Image definiert sind (z. B. vnext-preview, management) |
Schritt 5 — Sortieren und schreiben
Sortiere das Array zuerst nach aspirePackage (aufsteigend), dann nach isCompanion (primäre zuerst), dann nach name (aufsteigend).
Schreibe nach: src/frontend/src/data/container-images.json
Validierungs-Checkliste
Überprüfe nach dem Generieren der Datei:
- Jede
*ContainerImageTags.cs-Datei insrc/ist enthalten - Keine doppelten Einträge (gleiches
registry+image+tag+aspirePackage) - Alle
fullImage-Werte sind wohlgeformt (registry/image:tag) - Begleit-Images sind korrekt mit ihrem primären Image verknüpft
- Das JSON ist gültig und korrekt formatiert (2 Leerzeichen Einzug)
- Die Datei ist gemäß den obigen Regeln sortiert
Verwendung der Daten in Astro
Die JSON-Datei unter src/frontend/src/data/container-images.json kann direkt in Astro-Komponenten importiert werden:
import containerImages from '../data/container-images.json';
Dies folgt dem gleichen Muster wie vorhandene Datendateien wie aspire-integrations.json, samples.json und github-stats.json im selben Verzeichnis.
Verknüpfung mit verwandten Inhalten
Jeder Container-Image-Eintrag kann mit folgenden Elementen verknüpft werden:
- Die Integrationsdokumentation unter
src/frontend/src/data/integration-docs.json(Abgleich überaspirePackage) - Die NuGet-Integrationen unter
src/frontend/src/data/aspire-integrations.json(Abgleich übertitle≈aspirePackage) - Der Quellcode-Link zurück zu
microsoft/aspirefür Mitwirkende
Wichtige Regeln
- Entdecke Dateien immer dynamisch – neue Hosting-Pakete werden häufig hinzugefügt.
- Parst sowohl
const- als auchstatic-Eigenschaftsmuster – beide existieren in der Codebasis. - Löse String-Interpolation in berechneten Tag-Werten auf (z. B.
$"{Tag}-management"). - Füge keine Devcontainer-Images, Test-Only-Images oder Images aus dem Verzeichnis
playground/hinzu. - Extrahiere nur aus Dateien im Verzeichnis
src/, die auf*ContainerImageTags.cspassen. - Das aspire.dev-Repository ist eine Astro-Seite – die Datendatei liegt neben anderen JSON-Daten, die von Komponenten verwendet werden.