Communitygithub.com

Container-Images-Skill

Extrahiert alle Container-Image-Referenzen (Registry, Image, Tag) aus dem Quellcode von microsoft/aspire und erzeugt eine JSON-Datendatei für die aspire.dev Astro-Seite.

Was ist Container-Images-Skill?

Dieses Skill automatisiert die Extraktion aller Container-Image-Referenzen aus dem `microsoft/aspire` Produkt-Repository. Es durchsucht das Repository nach C#-Klassen vom Typ `*ContainerImageTags` (z. B. `RedisContainerImageTags.cs`), die konsistente Muster mit `Registry`, `Image` und `Tag`-Feldern verwenden. Der Skill erstellt eine strukturierte JSON-Datei in `microsoft/aspire.dev` unter `src/frontend/src/data/container-images.json`, die von Astro-Komponenten auf der aspire.dev-Seite eingelesen wird, um einen durchsuchbaren Katalog aller von Aspire-Hosting-Integrationen verwendeten Container-Images anzuzeigen. Er unterstützt die Extraktion von primären und Begleit-Images (z.B. pgAdmin zu PostgreSQL), die Auflösung von berechneten Tags und die Verknüpfung mit dem zugehörigen NuGet-Paket. Der Skill läuft auf Bash-Umgebungen und liest/schreibt Dateien. Er ist für einmalige Aktualisierungen der Container-Image-Daten optimiert, nicht für das Ändern des Quellcodes selbst.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/microsoft/aspire.dev/tree/HEAD/.agents/skills/container-images

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

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):

ProjektDatei
Aspire.Hosting.RedisRedisContainerImageTags.cs
Aspire.Hosting.PostgreSQLPostgresContainerImageTags.cs
Aspire.Hosting.SqlServerSqlServerContainerImageTags.cs
Aspire.Hosting.MongoDBMongoDBContainerImageTags.cs
Aspire.Hosting.MySqlMySqlContainerImageTags.cs
Aspire.Hosting.KafkaKafkaContainerImageTags.cs
Aspire.Hosting.RabbitMQRabbitMQContainerImageTags.cs
Aspire.Hosting.NatsNatsContainerImageTags.cs
Aspire.Hosting.GarnetGarnetContainerImageTags.cs
Aspire.Hosting.ValkeyValkeyContainerImageTags.cs
Aspire.Hosting.SeqSeqContainerImageTags.cs
Aspire.Hosting.QdrantQdrantContainerImageTags.cs
Aspire.Hosting.KeycloakKeycloakContainerImageTags.cs
Aspire.Hosting.OracleOracleContainerImageTags.cs
Aspire.Hosting.MilvusMilvusContainerImageTags.cs
Aspire.Hosting.ElasticsearchElasticsearchContainerImageTags.cs
Aspire.Hosting.YarpYarpContainerImageTags.cs
Aspire.Hosting.Azure.StorageStorageEmulatorContainerImageTags.cs
Aspire.Hosting.Azure.CosmosDBCosmosDBEmulatorContainerImageTags.cs
Aspire.Hosting.Azure.ServiceBusServiceBusEmulatorContainerImageTags.cs
Aspire.Hosting.Azure.EventHubsEventHubsEmulatorContainerImageTags.cs
Aspire.Hosting.Azure.SignalRSignalREmulatorContainerImageTags.cs
Aspire.Hosting.Azure.AppConfigurationAppConfigurationEmulatorContainerImageTags.cs
Aspire.Hosting.Azure.FunctionsDurableTaskSchedulerEmulatorContainerImageTags.cs
Aspire.Hosting.Azure.KustoAzureKustoEmulatorContainerImageTags.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:

  1. Primäres Image: Felder, die genau Registry, Image, Tag heißen.
  2. Begleit-Images: Felder mit einem Präfix, z. B. PgAdminRegistry, PgAdminImage, PgAdminTag – gruppiere sie nach dem gemeinsamen Präfix.
  3. Alternative Tags: Felder wie TagVNextPreview, ManagementTag – füge sie als zusätzliche Tag-Varianten zum selben Image hinzu.
  4. Statische Eigenschaften vs. const-Felder: Die meisten verwenden public const string, aber einige (z. B. Kusto) verwenden public static string { get; }. Behandle beide Fälle.
  5. Berechnete Tags: Manche Tags werden berechnet, z. B. public const string ManagementTag = $"{Tag}-management"; – löse sie zu ihrem Literalwert auf.
  6. Leite aspirePackage aus dem Projektverzeichnisnamen ab (z. B. src/Aspire.Hosting.Redis/ → Aspire.Hosting.Redis).
  7. Leite sourceFile als 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

FeldTypBeschreibung
aspirePackagestringDer NuGet-Paket-/Projektname (Verzeichnisname unter src/)
namestringBenutzerfreundlicher 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.
registrystringContainer-Registry-Host (z. B. docker.io, mcr.microsoft.com, ghcr.io, quay.io, container-registry.oracle.com)
imagestringImage-Pfad innerhalb der Registry
tagstringPrimärer Tag
fullImagestringVollständig qualifizierte Image-Referenz: {registry}/{image}:{tag}
sourceFilestringRelativer Pfad zur Quelldatei in microsoft/aspire
sourceUrlstringGitHub-Permalink zur Quelldatei im main-Branch
isCompanionbooleantrue, wenn es sich um ein Begleit-/Tooling-Image handelt (z. B. pgAdmin, Kafka UI, phpMyAdmin)
companionOfstring?Name des primären Images, das begleitet wird, oder null
alternateTagsstring[]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 in src/ 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 über aspirePackage)
  • Die NuGet-Integrationen unter src/frontend/src/data/aspire-integrations.json (Abgleich über title ≈ aspirePackage)
  • Der Quellcode-Link zurück zu microsoft/aspire für Mitwirkende

Wichtige Regeln

  • Entdecke Dateien immer dynamisch – neue Hosting-Pakete werden häufig hinzugefügt.
  • Parst sowohl const- als auch static-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.cs passen.
  • Das aspire.dev-Repository ist eine Astro-Seite – die Datendatei liegt neben anderen JSON-Daten, die von Komponenten verwendet werden.

Verwandte Skills