Communitygithub.com

microsoft/aspire.dev

microsoft/aspire 소스 코드에서 모든 컨테이너 이미지 참조(레지스트리, 이미지, 태그)를 추출하여 aspire.dev Astro 사이트에서 사용하는 JSON 데이터 파일을 생성합니다. 컨테이너 이미지 JSON 업데이트, 이미지 데이터 갱신, 모든 Aspire 컨테이너 이미지 목록 조회, 이미지 버전 동기화, container-images.json 생성에 사용합니다.

aspire.dev란 무엇인가요?

이 스킬은 microsoft/aspire 코드베이스에서 모든 컨테이너 이미지 참조를 자동으로 추출하여 aspire.dev Astro 사이트에서 사용할 구조화된 JSON 데이터 파일을 생성합니다. Aspire 호스팅 통합에서 사용하는 모든 컨테이너 이미지(예: Redis, PostgreSQL, SQL Server 등)의 레지스트리, 이미지 경로, 태그를 수집하여 src/frontend/src/data/container-images.json에 기록합니다. 이 스킬은 bash와 파일 읽기/쓰기를 기반으로 동작하며, *ContainerImageTags.cs 정적 클래스에서 이미지 메타데이터를 파싱합니다. C# 코드 패턴(정적 상수 및 속성)을 이해하고, 기본 이미지와 컴패니언 이미지를 구분하며, 보조 태그와 계산된 태그 값을 처리할 수 있습니다. 특히 새로운 호스팅 패키지가 자주 추가되므로 항상 파일을 동적으로 검색하도록 설계되어 있습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/microsoft/aspire.dev/tree/HEAD/.agents/skills/container-images

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

컨테이너 이미지 스킬

이 스킬은 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.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단계 — 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단계 — 각 파일 파싱

각 파일에 대해 모든 이미지 그룹을 추출합니다. 단일 파일은 여러 이미지(기본 이미지 + 컴패니언)를 정의할 수 있습니다. 파싱 규칙은 다음과 같습니다:

  1. 기본 이미지: 정확히 Registry, Image, Tag로 명명된 필드.
  2. 컴패니언 이미지: 접두사가 있는 필드(예: PgAdminRegistry, PgAdminImage, PgAdminTag) — 공유 접두사를 기준으로 그룹화합니다.
  3. 대체 태그: TagVNextPreview, ManagementTag와 같은 필드 — 동일한 이미지에 대한 추가 태그 변형으로 포함합니다.
  4. 정적 속성 vs const 필드: 대부분은 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 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"]
  }
]

필드 정의

필드타입설명
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전체 이미지 참조: {registry}/{image}:{tag}
sourceFilestringmicrosoft/aspire의 소스 파일 상대 경로
sourceUrlstringmain 브랜치의 소스 파일에 대한 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 파일은 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 데이터와 함께 위치합니다.

관련 스킬