Communitygithub.com

microsoft/aspire.dev

从 microsoft/aspire 源代码中提取所有容器镜像引用(仓库、镜像、标签),并为 aspire.dev Astro 站点生成 JSON 数据文件。

aspire.dev 是什么?

本技能用于从 microsoft/aspire 产品仓库中提取所有容器镜像引用,并生成结构化的 JSON 文件,供 aspire.dev 网站的 Astro 组件使用。它通过扫描源码中所有 `*ContainerImageTags.cs` 文件,解析其中定义的注册表、镜像路径和标签等常量,构建出每个容器镜像的完整信息(包括配套镜像、备选标签等),然后写入 `aspire.dev` 仓库的 `src/frontend/src/data/container-images.json` 路径。该技能适用于更新容器镜像 JSON、刷新镜像数据、列出所有 Aspire 容器镜像、同步镜像版本等场景;不支持直接修改 aspire 源码中的镜像版本,也不处理 NuGet 包数据或开发容器中的 Dockerfile 镜像。它内置了详细的提取流程、字段定义、排序规则和验证清单,能够自动发现新增的托管包。当需要快速查询单个镜像标签时,建议直接使用 grep/find 命令。

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

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

容器镜像技能

本技能从 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 <名称>ContainerImageTags
{
    public const string Registry = "<仓库主机>";
    public const string Image = "<镜像路径>";
    public const string Tag = "<标签>";

    // 某些文件还有额外的配套镜像,例如:
    public const string <配套名称>Registry = "<仓库主机>";
    public const string <配套名称>Image = "<镜像路径>";
    public const string <配套名称>Tag = "<标签>";
}

查找位置

所有匹配以下 glob 模式的文件:

src/**/ContainerImageTags.cs
src/**/*ContainerImageTags.cs

这些文件分布于许多项目中,包括(但不限于):

项目文件
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

重要提示: 新的托管包可能随时添加。始终动态发现文件 — 切勿依赖硬编码列表。


提取步骤

步骤 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 — 解析每个文件

对于每个文件,提取 所有 镜像组。一个文件可以定义多个镜像(主镜像 + 配套镜像)。解析规则如下:

  1. 主镜像:字段名恰好为 Registry、Image、Tag。
  2. 配套镜像:带有前缀的字段,例如 PgAdminRegistry、PgAdminImage、PgAdminTag — 按共享前缀分组。
  3. 备选标签:类似 TagVNextPreview、ManagementTag 的字段 — 将它们作为同一镜像的附加标签变体包含。
  4. 静态属性与常量字段:大部分使用 public const string,但有些(例如 Kusto)使用 public static string { get; }。两种模式都要处理。
  5. 计算标签:某些标签是通过计算得到的,例如 public const string ManagementTag = $"{Tag}-management"; — 解析为其字面值。
  6. 推导 aspirePackage:从项目目录名中获取(例如 src/Aspire.Hosting.Redis/ → Aspire.Hosting.Redis)。
  7. 推导 sourceFile:相对于仓库根目录的路径。

步骤 4 — 构建 JSON

输出数组中的每个条目代表 一个不同的容器镜像:

[
  {
    "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 模拟器",
    "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"]
  }
]

字段定义

字段类型描述
aspirePackagestringNuGet 包/项目名称(src/ 下的目录名)
namestring友好名称。对于主镜像,从类名推导(去掉 ContainerImageTags / EmulatorContainerImageTags 后缀,拆分 PascalCase)。对于配套镜像,从配套前缀/类型推导(例如 PgAdmin*、RedisCommander*),而不仅仅依赖类名。
registrystring容器仓库主机(例如 docker.io、mcr.microsoft.com、ghcr.io、quay.io、container-registry.oracle.com)
imagestring仓库内的镜像路径
tagstring主标签
fullImagestring完全限定的镜像引用:{仓库}/{镜像}:{标签}
sourceFilestring在 microsoft/aspire 中源文件的相对路径
sourceUrlstring指向 main 分支上源文件的 GitHub 永久链接
isCompanionboolean如果为配套/工具镜像(例如 pgAdmin、Kafka UI、phpMyAdmin)则为 true
companionOfstring?该镜像所配套的主镜像名称,如果为主镜像则为 null
alternateTagsstring[]为该镜像定义的任何额外标签常量(例如 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 数据放在一起。

相关技能