Skill de Imágenes de Contenedor
Esta skill extrae todas las referencias de imágenes de contenedor del repositorio de producto microsoft/aspire y escribe un archivo JSON estructurado en microsoft/aspire.dev en:
src/frontend/src/data/container-images.json
Este JSON es consumido por componentes Astro en el sitio aspire.dev para mostrar un catálogo navegable de todas las imágenes de contenedor utilizadas por las integraciones de hosting de Aspire.
Patrón del código fuente
Todos los metadatos de imágenes de contenedor en microsoft/aspire residen en clases estáticas llamadas *ContainerImageTags (o *ContainerImageTags.cs). Cada archivo sigue un patrón estricto y consistente:
internal static class <Nombre>ContainerImageTags
{
public const string Registry = "<host-del-registro>";
public const string Image = "<ruta-de-la-imagen>";
public const string Tag = "<etiqueta>";
// Algunos archivos tienen imágenes complementarias adicionales, por ejemplo:
public const string <Complemento>Registry = "<host-del-registro>";
public const string <Complemento>Image = "<ruta-de-la-imagen>";
public const string <Complemento>Tag = "<etiqueta>";
}
Dónde encontrarlos
Todos los archivos que coinciden con el patrón glob:
src/**/ContainerImageTags.cs
src/**/*ContainerImageTags.cs
Estos se distribuyen en muchos proyectos, incluyendo (pero no limitado a):
| Proyecto | Archivo |
|---|---|
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 |
Importante: Pueden agregarse nuevos paquetes de hosting en cualquier momento. Siempre descubre archivos dinámicamente — nunca confíes en una lista fija.
Procedimiento de extracción
Paso 1 — Clonar o acceder al repositorio aspire en HEAD
# Si trabajas localmente:
git clone --depth 1 https://github.com/microsoft/aspire.git /tmp/aspire
Paso 2 — Encontrar todos los archivos ContainerImageTags
find /tmp/aspire/src -name '*ContainerImageTags.cs' -type f
Paso 3 — Analizar cada archivo
Para cada archivo, extrae todos los grupos de imágenes. Un solo archivo puede definir múltiples imágenes (principal + complementarias). Las reglas de análisis son:
- Imagen principal: Campos nombrados exactamente
Registry,Image,Tag. - Imágenes complementarias: Campos con un prefijo, por ejemplo,
PgAdminRegistry,PgAdminImage,PgAdminTag— agrúpalos por el prefijo compartido. - Etiquetas alternativas: Campos como
TagVNextPreview,ManagementTag— inclúyelos como variantes de etiqueta adicionales en la misma imagen. - Propiedades estáticas vs campos const: La mayoría usa
public const string, pero algunos (ej. Kusto) usanpublic static string { get; }. Maneja ambos. - Etiquetas calculadas: Algunas etiquetas se calculan, por ejemplo,
public const string ManagementTag = $"{Tag}-management";— resuélvelas a su valor literal. - Derivar
aspirePackagedel nombre del directorio del proyecto (ej.src/Aspire.Hosting.Redis/→Aspire.Hosting.Redis). - Derivar
sourceFilecomo la ruta relativa a la raíz del repositorio.
Paso 4 — Construir el JSON
Cada entrada en el arreglo de salida representa una imagen de contenedor distinta:
[
{
"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": "Emulador de CosmosDB",
"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"]
}
]
Definiciones de campo
| Campo | Tipo | Descripción |
|---|---|---|
aspirePackage | string | El nombre del paquete NuGet / proyecto (nombre del directorio bajo src/) |
name | string | Nombre legible para humanos. Para imágenes principales, derívalo del nombre de la clase (elimina el sufijo ContainerImageTags / EmulatorContainerImageTags, divide PascalCase). Para imágenes complementarias, derívalo del prefijo/tipo del complemento (ej. PgAdmin*, RedisCommander*) en lugar de solo del nombre de la clase. |
registry | string | Host del registro de contenedores (ej. docker.io, mcr.microsoft.com, ghcr.io, quay.io, container-registry.oracle.com) |
image | string | Ruta de la imagen dentro del registro |
tag | string | Etiqueta principal |
fullImage | string | Referencia completa de la imagen: {registry}/{image}:{tag} |
sourceFile | string | Ruta relativa al archivo fuente en microsoft/aspire |
sourceUrl | string | Enlace permanente de GitHub al archivo fuente en la rama main |
isCompanion | boolean | true si esta es una imagen complementaria/de herramientas (ej. pgAdmin, Kafka UI, phpMyAdmin) |
companionOf | string? | Nombre de la imagen principal a la que acompaña, o null |
alternateTags | string[] | Cualquier constante de etiqueta adicional definida para esta imagen (ej. vnext-preview, management) |
Paso 5 — Ordenar y escribir
Ordena el arreglo por aspirePackage (ascendente), luego por isCompanion (principales primero), luego por name (ascendente).
Escribe en: src/frontend/src/data/container-images.json
Lista de verificación de validación
Después de generar el archivo, verifica:
- Cada archivo
*ContainerImageTags.csensrc/está representado - No hay entradas duplicadas (mismo
registry+image+tag+aspirePackage) - Todos los valores de
fullImageestán bien formados (registry/image:tag) - Las imágenes complementarias están correctamente vinculadas a su principal
- El JSON es válido y está formateado correctamente (sangría de 2 espacios)
- El archivo está ordenado según las reglas anteriores
Consumir los datos en Astro
El archivo JSON en src/frontend/src/data/container-images.json se puede importar directamente en componentes Astro:
import containerImages from '../data/container-images.json';
Esto sigue el mismo patrón que los archivos de datos existentes como aspire-integrations.json, samples.json y github-stats.json en el mismo directorio.
Vincular a contenido relacionado
Cada entrada de imagen de contenedor se puede hacer referencia cruzada con:
- Los documentos de integración en
src/frontend/src/data/integration-docs.json(coincidir poraspirePackage) - Las integraciones NuGet en
src/frontend/src/data/aspire-integrations.json(coincidir portitle≈aspirePackage) - El enlace al archivo fuente de vuelta a
microsoft/aspirepara contribuyentes
Reglas importantes
- Siempre descubre archivos dinámicamente — se agregan nuevos paquetes de hosting con frecuencia.
- Analiza tanto patrones de
constcomo de propiedadesstatic— ambos existen en el código base. - Resuelve la interpolación de cadenas en valores de etiquetas calculadas (ej.
$"{Tag}-management"). - No incluyas imágenes de devcontainer, imágenes solo de prueba o imágenes del directorio
playground/. - Solo extrae del directorio
src/archivos que coincidan con*ContainerImageTags.cs. - El repositorio aspire.dev es un sitio Astro — el archivo de datos se encuentra junto a otros datos JSON consumidos por componentes.
Checklist de validación
Después de generar el archivo, verifica:
- Cada archivo
*ContainerImageTags.csensrc/está representado - No hay entradas duplicadas (mismo
registry+image+tag+aspirePackage) - Todos los valores de
fullImageestán bien formados (registry/image:tag) - Las imágenes complementarias están correctamente vinculadas a su principal
- El JSON es válido y está formateado correctamente (sangría de 2 espacios)
- El archivo está ordenado según las reglas anteriores