Zum Inhalt springen

OCI Stack Bundles

ReadyStackGo kann Stack-Definitionen direkt aus OCI Container-Registries wie Docker Hub, GitHub Container Registry (GHCR) oder Azure Container Registry laden. Dies ermöglicht versionierte Stack-Verteilung über CI/CD Pipelines und deterministische Deployments mit Lock Files.

FeatureBeschreibung
OCI Registry SourceContainer-Registry als Stack Source hinzufügen
Tag-basierte VersionierungJeder Registry-Tag repräsentiert eine Stack-Version
Glob Tag-FilterungTags mit Patterns filtern wie v*, ams-*
Lock File SupportImages auf Digests pinnen für deterministische Deployments
Test ConnectionRegistry-Zugriff vor dem Hinzufügen prüfen
AuthentifizierungUnterstützung für private Registries mit Username/Password

Schritt für Schritt: OCI Registry Source hinzufügen

Abschnitt betitelt „Schritt für Schritt: OCI Registry Source hinzufügen“

Navigieren Sie zu SettingsStack SourcesAdd Source.

Wählen Sie OCI Registry aus der Source-Type-Auswahl.

Füllen Sie die Registry-Details aus:

  • Source ID – Eindeutiger Bezeichner (z.B. my-oci-stacks)
  • Display Name – Anzeigename
  • Registry Host – Registry-Hostname ohne Protokoll (z.B. docker.io, ghcr.io, myregistry.azurecr.io)
  • Repository – Vollständiger Repository-Pfad (z.B. myorg/rsgo-stacks)
  • Tag Pattern – Glob-Pattern zum Filtern von Tags (Standard: * = alle Tags)

Schritt 4: Authentifizierung konfigurieren (Optional)

Abschnitt betitelt „Schritt 4: Authentifizierung konfigurieren (Optional)“

Für private Registries Zugangsdaten eingeben:

  • Username – Registry-Benutzername
  • Password / Token – Access Token oder Passwort
RegistryUsernamePassword
Docker HubDocker Hub BenutzernameAccess Token
GHCRGitHub BenutzernamePAT mit read:packages
Azure CRService Principal IDService Principal Secret

Klicken Sie auf Test Connection um den Zugriff zu prüfen. Der Test listet verfügbare Tags und zeigt eine Vorschau der ersten 10 Tags.

Klicken Sie auf Create Source. RSGO synchronisiert sofort und lädt Stacks von passenden Tags.


Ein OCI Stack Bundle ist ein Container-Image mit Stack-Definitions-Dateien als Layer.

LayerMedia TypeInhaltPflicht
1application/vnd.rsgo.stack.manifest.v1+yamlstack.yaml – RSGO ManifestJa
2application/vnd.rsgo.stack.lock.v1+jsonlock.json – Image DigestsNein
3application/vnd.rsgo.stack.meta.v1+jsonmeta.json – Marketplace MetadatenNein

Sie können auch ein Standard Docker Image verwenden mit Stack-Dateien an bekannten Pfaden:

/rsgo/stack.yaml # oder stack.yml
/rsgo/lock.json # optional
/rsgo/meta.json # optional

RSGO extrahiert diese Dateien automatisch aus tar.gz Layern beim Sync.


Ein Lock File pinnt jedes Service-Image auf einen bestimmten Digest (sha256:...) anstatt eines veränderbaren Tags. Dies stellt sicher, dass Deployments exakt dasselbe Image verwenden, unabhängig von Tag-Änderungen.

{
"apiVersion": "1",
"stackName": "my-app",
"stackVersion": "1.0.0",
"images": [
{
"name": "web",
"image": "nginx",
"tag": "1.25-alpine",
"digest": "sha256:a8281ce42034b078dc7d88a5bfe6cb40...",
"role": "main"
},
{
"name": "cache",
"image": "redis",
"tag": "7-alpine",
"digest": "sha256:e422889e156a60c4e7f0ba0c3e5b..."
}
]
}
  1. Wenn ein Lock File existiert und einen Eintrag für einen Service enthält → image@sha256:digest
  2. Wenn kein Lock-Eintrag für einen Service existiert → Fallback auf image:tag
  3. Lock Files sind optional — Deployments funktionieren auch ohne

FROM scratch
COPY stack.yaml /rsgo/stack.yaml
COPY lock.json /rsgo/lock.json
Terminal-Fenster
docker build -t ghcr.io/myorg/rsgo-stacks:v1.0.0 .
docker push ghcr.io/myorg/rsgo-stacks:v1.0.0
Terminal-Fenster
oras push ghcr.io/myorg/rsgo-stacks:v1.0.0 \
stack.yaml:application/vnd.rsgo.stack.manifest.v1+yaml \
lock.json:application/vnd.rsgo.stack.lock.v1+json
name: Publish Stack Bundle
on:
push:
tags: ['v*']
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Log in to GHCR
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- name: Build and push bundle
run: |
docker build -t ghcr.io/${{ github.repository }}/stacks:${{ github.ref_name }} .
docker push ghcr.io/${{ github.repository }}/stacks:${{ github.ref_name }}

  • Heruntergeladene Manifeste werden in ~/.rsgo/oci-cache/{sourceId}/{tag}/ gecacht
  • Beim Sync prüft RSGO den Manifest-Digest — bei Gleichheit wird der Cache verwendet
  • Nur neue oder geänderte Tags lösen einen erneuten Download aus
  • Pagination wird für Repositories mit mehr als 100 Tags unterstützt

POST /api/stack-sources/test-oci-connection
FeldTypPflichtBeschreibung
registryUrlstringJaRegistry-Hostname
repositorystringJaRepository-Pfad
usernamestringNeinRegistry-Benutzername
passwordstringNeinRegistry-Passwort

Response:

{
"success": true,
"message": "Connection successful. Found 15 tag(s).",
"tagCount": 15,
"sampleTags": ["v1.0.0", "v1.1.0", "v2.0.0"]
}
POST /api/stack-sources
{
"id": "my-oci-stacks",
"name": "My OCI Stacks",
"type": "OciRegistry",
"registryUrl": "ghcr.io",
"repository": "myorg/rsgo-stacks",
"tagPattern": "v*",
"registryUsername": "user",
"registryPassword": "token"
}