컨테이너 이미지 스킬
이 스킬은 microsoft/aspire 제품 리포지토리에서 모든 컨테이너 이미지 참조를 추출하여 microsoft/aspire.dev 리포지토리의 다음 경로에 구조화된 JSON 파일을 씁니다:
src/frontend/src/data/container-images.json
이 JSON은 aspire.dev 사이트의 Astro 컴포넌트에서 Aspire 호스팅 통합에 사용되는 모든 컨테이너 이미지의 탐색 가능한 카탈로그를 렌더링하는 데 사용됩니다.
소스 코드 패턴
microsoft/aspire의 모든 컨테이너 이미지 메타데이터는 *ContainerImageTags(또는 *ContainerImageTags.cs)라는 정적 클래스에 있습니다. 각 파일은 엄격하고 일관된 패턴을 따릅니다:
internal static class <Name>ContainerImageTags
{
public const string Registry = "<registry-host>";
public const string Image = "<image-path>";
public const string Tag = "<tag>";
// 일부 파일은 추가적인 컴패니언 이미지를 가집니다. 예:
public const string <Companion>Registry = "<registry-host>";
public const string <Companion>Image = "<image-path>";
public const string <Companion>Tag = "<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단계 — HEAD에서 aspire 리포지토리 클론 또는 액세스
# 로컬에서 작업하는 경우:
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와 같은 필드 — 동일한 이미지에 대한 추가 태그 변형으로 포함합니다. - 정적 속성 vs const 필드: 대부분은
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 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"]
}
]
필드 정의
| 필드 | 타입 | 설명 |
|---|---|---|
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 | 전체 이미지 참조: {registry}/{image}:{tag} |
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 파일은 Astro 컴포넌트에서 직접 가져올 수 있습니다:
import containerImages from '../data/container-images.json';
이는 같은 디렉터리의 기존 데이터 파일(aspire-integrations.json, samples.json, github-stats.json)과 동일한 패턴을 따릅니다.
관련 콘텐츠 연결
각 컨테이너 이미지 항목은 다음 항목과 상호 참조할 수 있습니다:
src/frontend/src/data/integration-docs.json의 통합 문서(aspirePackage로 일치)src/frontend/src/data/aspire-integrations.json의 NuGet 통합(title≈aspirePackage로 일치)- 기여자를 위한 소스 파일 링크(
microsoft/aspire)
중요 규칙
- 항상 파일을 동적으로 검색하십시오 — 새 호스팅 패키지가 자주 추가됩니다.
const및static속성 패턴을 모두 파싱하십시오 — 둘 다 코드베이스에 존재합니다.- 계산된 태그 값에서 문자열 보간을 해석하십시오(예:
$"""{Tag}-management"""). - devcontainer 이미지, 테스트 전용 이미지 또는
playground/디렉터리의 이미지는 포함하지 마십시오. src/디렉터리에서*ContainerImageTags.cs패턴과 일치하는 파일만 추출하십시오.- aspire.dev 리포지토리는 Astro 사이트입니다 — 데이터 파일은 컴포넌트가 소비하는 다른 JSON 데이터와 함께 위치합니다.