Skill de Imagens de Contêiner
Esta skill extrai todas as referências de imagens de contêiner do repositório de produto microsoft/aspire e escreve um arquivo JSON estruturado em microsoft/aspire.dev no seguinte caminho:
src/frontend/src/data/container-images.json
Este JSON é consumido por componentes Astro no site aspire.dev para renderizar um catálogo navegável de todas as imagens de contêiner usadas pelas integrações de hospedagem do Aspire.
Padrão do código-fonte
Todos os metadados de imagens de contêiner no microsoft/aspire residem em classes estáticas chamadas *ContainerImageTags (ou *ContainerImageTags.cs). Cada arquivo segue um padrão estrito e consistente:
internal static class <Nome>ContainerImageTags
{
public const string Registry = "<host-do-registry>";
public const string Image = "<caminho-da-imagem>";
public const string Tag = "<tag>";
// Alguns arquivos têm imagens companheiras adicionais, por exemplo:
public const string <Companion>Registry = "<host-do-registry>";
public const string <Companion>Image = "<caminho-da-imagem>";
public const string <Companion>Tag = "<tag>";
}
Onde encontrá-los
Todos os arquivos que correspondem ao padrão glob:
src/**/ContainerImageTags.cs
src/**/*ContainerImageTags.cs
Estes estão espalhados por muitos projetos, incluindo (mas não limitado a):
| Projeto | Arquivo |
|---|---|
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: Novos pacotes de hospedagem podem ser adicionados a qualquer momento. Sempre descubra arquivos dinamicamente — nunca confie em uma lista fixa.
Procedimento de extração
Etapa 1 — Clonar ou acessar o repositório aspire no HEAD
# Se estiver trabalhando localmente:
git clone --depth 1 https://github.com/microsoft/aspire.git /tmp/aspire
Etapa 2 — Encontrar todos os arquivos ContainerImageTags
find /tmp/aspire/src -name '*ContainerImageTags.cs' -type f
Etapa 3 — Analisar cada arquivo
Para cada arquivo, extraia todos os grupos de imagens. Um único arquivo pode definir múltiplas imagens (principal + companheiras). As regras de análise são:
- Imagem principal: Campos exatamente chamados
Registry,Image,Tag. - Imagens companheiras: Campos com um prefixo, por exemplo,
PgAdminRegistry,PgAdminImage,PgAdminTag— agrupe-os pelo prefixo compartilhado. - Tags alternativas: Campos como
TagVNextPreview,ManagementTag— inclua-os como variantes de tag adicionais na mesma imagem. - Propriedades estáticas vs campos const: A maioria usa
public const string, mas alguns (ex.: Kusto) usampublic static string { get; }. Lide com ambos. - Tags computadas: Algumas tags são computadas, por exemplo,
public const string ManagementTag = $"{Tag}-management";— resolva-as para seu valor literal. - Derive o
aspirePackagea partir do nome do diretório do projeto (ex.:src/Aspire.Hosting.Redis/→Aspire.Hosting.Redis). - Derive o
sourceFilecomo o caminho relativo à raiz do repositório.
Etapa 4 — Construir o JSON
Cada entrada no array de saída representa uma imagem de contêiner 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 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"]
}
]
Definições dos campos
| Campo | Tipo | Descrição |
|---|---|---|
aspirePackage | string | O nome do pacote NuGet / projeto (nome do diretório sob src/) |
name | string | Nome amigável. Para imagens principais, derive do nome da classe (remova o sufixo ContainerImageTags / EmulatorContainerImageTags, divida PascalCase). Para imagens companheiras, derive do prefixo/tipo companheiro (ex.: PgAdmin*, RedisCommander*) em vez de apenas do nome da classe. |
registry | string | Host do registry de contêiner (ex.: docker.io, mcr.microsoft.com, ghcr.io, quay.io, container-registry.oracle.com) |
image | string | Caminho da imagem dentro do registry |
tag | string | Tag principal |
fullImage | string | Referência de imagem totalmente qualificada: {registry}/{image}:{tag} |
sourceFile | string | Caminho relativo ao arquivo fonte no microsoft/aspire |
sourceUrl | string | Link permanente do GitHub para o arquivo fonte na branch main |
isCompanion | boolean | true se esta for uma imagem companheira/ferramenta (ex.: pgAdmin, Kafka UI, phpMyAdmin) |
companionOf | string? | Nome da imagem principal que esta acompanha, ou null |
alternateTags | string[] | Quaisquer constantes de tag adicionais definidas para esta imagem (ex.: vnext-preview, management) |
Etapa 5 — Ordenar e escrever
Ordene o array por aspirePackage (ascendente), depois por isCompanion (principais primeiro), depois por name (ascendente).
Escreva em: src/frontend/src/data/container-images.json
Lista de verificação de validação
Após gerar o arquivo, verifique:
- Cada arquivo
*ContainerImageTags.csemsrc/está representado - Nenhuma entrada duplicada (mesmo
registry+image+tag+aspirePackage) - Todos os valores
fullImageestão bem formados (registry/image:tag) - Imagens companheiras estão corretamente vinculadas à sua principal
- O JSON é válido e formatado corretamente (indentação de 2 espaços)
- O arquivo está ordenado conforme as regras acima
Consumindo os dados no Astro
O arquivo JSON em src/frontend/src/data/container-images.json pode ser importado diretamente em componentes Astro:
import containerImages from '../data/container-images.json';
Isso segue o mesmo padrão de arquivos de dados existentes, como aspire-integrations.json, samples.json e github-stats.json no mesmo diretório.
Vinculando a conteúdo relacionado
Cada entrada de imagem de contêiner pode ser referenciada cruzadamente com:
- A documentação de integração em
src/frontend/src/data/integration-docs.json(correspondência poraspirePackage) - As integrações NuGet em
src/frontend/src/data/aspire-integrations.json(correspondência portitle≈aspirePackage) - O arquivo fonte com link de volta para
microsoft/aspirepara contribuidores
Regras importantes
- Sempre descubra arquivos dinamicamente — novos pacotes de hospedagem são adicionados com frequência.
- Analise tanto padrões de
constquanto de propriedadesstatic— ambos existem no codebase. - Resolva interpolação de strings em valores de tag computados (ex.:
$"""{Tag}-management"""). - Não inclua imagens de devcontainer, imagens apenas de teste ou imagens do diretório
playground/. - Extraia apenas do diretório
src/arquivos que correspondam a*ContainerImageTags.cs. - O repositório aspire.dev é um site Astro — o arquivo de dados fica ao lado de outros dados JSON consumidos por componentes.