容器镜像技能
本技能从 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.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 |
重要提示: 新的托管包可能随时添加。始终动态发现文件 — 切勿依赖硬编码列表。
提取步骤
步骤 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 — 解析每个文件
对于每个文件,提取 所有 镜像组。一个文件可以定义多个镜像(主镜像 + 配套镜像)。解析规则如下:
- 主镜像:字段名恰好为
Registry、Image、Tag。 - 配套镜像:带有前缀的字段,例如
PgAdminRegistry、PgAdminImage、PgAdminTag— 按共享前缀分组。 - 备选标签:类似
TagVNextPreview、ManagementTag的字段 — 将它们作为同一镜像的附加标签变体包含。 - 静态属性与常量字段:大部分使用
public const string,但有些(例如 Kusto)使用public static string { get; }。两种模式都要处理。 - 计算标签:某些标签是通过计算得到的,例如
public const string ManagementTag = $"{Tag}-management";— 解析为其字面值。 - 推导
aspirePackage:从项目目录名中获取(例如src/Aspire.Hosting.Redis/→Aspire.Hosting.Redis)。 - 推导
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"]
}
]
字段定义
| 字段 | 类型 | 描述 |
|---|---|---|
aspirePackage | string | NuGet 包/项目名称(src/ 下的目录名) |
name | string | 友好名称。对于主镜像,从类名推导(去掉 ContainerImageTags / EmulatorContainerImageTags 后缀,拆分 PascalCase)。对于配套镜像,从配套前缀/类型推导(例如 PgAdmin*、RedisCommander*),而不仅仅依赖类名。 |
registry | string | 容器仓库主机(例如 docker.io、mcr.microsoft.com、ghcr.io、quay.io、container-registry.oracle.com) |
image | string | 仓库内的镜像路径 |
tag | string | 主标签 |
fullImage | string | 完全限定的镜像引用:{仓库}/{镜像}:{标签} |
sourceFile | string | 在 microsoft/aspire 中源文件的相对路径 |
sourceUrl | string | 指向 main 分支上源文件的 GitHub 永久链接 |
isCompanion | boolean | 如果为配套/工具镜像(例如 pgAdmin、Kafka UI、phpMyAdmin)则为 true |
companionOf | string? | 该镜像所配套的主镜像名称,如果为主镜像则为 null |
alternateTags | string[] | 为该镜像定义的任何额外标签常量(例如 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 数据放在一起。