
Minimale CVE-gehärtete Container-Image-Sammlung
Kleine, gehärtete Container-Images, kostenlos und MIT-lizenziert.
Aus dem Quellcode mit Chainguards apko und Wolfi-Paketen gebaut, alle sechs Stunden neu erstellt.
Jedes Image ist mit cosign signiert, enthält eine SPDX-SBOM-Bescheinigung und führt den SLSA-Level-3-Build-Provenance mit. Sie können alles ohne Konto überprüfen.
🌐 Das vollständige Katalog durchsuchen auf minimalcontainers.com →
Bildkatalog · Ein Image überprüfen · Alle 57 Bilder · HN-Diskussion
Der Sinn dieser Images ist, dass Sie mir nicht vertrauen müssen. Laden Sie eines herunter und überprüfen Sie dann selbst die Provenienz:```bash
docker pull ghcr.io/rtvkiz/minimal-python:latest
gh attestation verify oci://ghcr.io/rtvkiz/minimal-python:latest --owner rtvkiz
cosign verify-attestation --type spdxjson
--certificate-identity-regexp='https://github.com/rtvkiz/minimal/'
--certificate-oidc-issuer='https://token.actions.githubusercontent.com'
ghcr.io/rtvkiz/minimal-python:latest
| jq -r '.payload | @base64d | fromjson | .predicate' > python-sbom.spdx.json
Weitere Verifikationsrezepte (Cosign-Signatur, SBOM, SLSA-Provenienz) befinden sich in [`.github/SECURITY.md`](https://github.com/rtvkiz/minimal/blob/main/.github/SECURITY.md).
## Wie sich `minimal` unterscheidet
| | minimal | Chainguard | Docker Hardened | Minimus / RapidFort |
|---|:---:|:---:|:---:|:---:|
| **Lizenz** | MIT | Proprietär | Apache-2.0 | Proprietär |
| **Kosten** | $0 | ~$30.000/Bild/Jahr | Kostenlos + kostenpflichtiger Support | Verkaufsgespräch |
| **Authentifizierung zum Pull** | Nein | Ja | Ja | Ja |
| **Ratenbegrenzungen** | Keine | Ja | Ja | Ja |
| **Bau-Rezepte öffentlich** | Ja, jede `melange.yaml` | Nein | Ja, Dockerfiles | Nein |
| **Cosign-Sig + SBOM + SLSA L3** | Ja | Ja | Ja | Ja |
| **Anbieter-SLA, FedRAMP/STIG** | Nein | Ja (kostenpflichtig) | Ja (kostenpflichtig) | Ja (kostenpflichtig) |
Greifen Sie zu `minimal` wenn Sie gehärtete Images ohne Bezahlung oder Registrierung möchten, wenn Sie jedes Bau-Rezept vollständig lesen möchten, oder wenn Sie eine funktionierende Vorlage zum Forken in Ihren eigenen internen Katalog wünschen.
Es ist wahrscheinlich nicht die richtige Wahl, wenn Sie einen Anbietervertrag, FedRAMP- oder STIG-Akkreditierungsunterlagen oder am ersten Tag tausend oder mehr Images benötigen – das sind reale Dinge, die dieses Projekt nicht zu lösen versucht.
## Was jedes Image mitbringt
- Eine Cosign-Signatur ohne Schlüssel, verifizierbar gegen das öffentliche Rekor-Transparenzlogbuch.
- Ein SPDX-SBOM, das als In-toto-Bestätigung angehängt ist – jedes Paket, jede Version und jede Lizenz.
- SLSA v1.0-Build-Provenienz – kryptografischer Nachweis, welcher Workflow, welcher Commit und welcher Runner das Image erstellt hat.
- Ein täglicher Grype-Scan, mit Ergebnissen im [öffentlichen Katalog](https://minimalcontainers.com) und dem GitHub Security-Tab.
- Native `linux/amd64`- und `linux/arm64`-Builds.
- Standardmäßig ein Nicht-Root-Benutzer (UID 65532), es sei denn, das Upstream-Projekt besteht auf etwas anderem.
- Keine Shell, wo möglich – die meisten Images liefern kein `/bin/sh` mit.
- Ein sechsstündiger Neubau-Rhythmus, sodass Wolfi-CVE-Patches in Stunden statt Tagen ankommen.
## Verfügbare Images – 57 insgesamt
| Kategorie | Anzahl | Highlights |
|---|---|---|
| **Sprachen & Laufzeiten** | 9 | python, node-slim, bun, go, java, ruby, php, dotnet, deno |
| **Datenbanken** | 5 | mysql, mariadb, postgres-slim, sqlite, opensearch |
| **Caches, Warteschlangen, Messaging** | 7 | redis-slim, valkey, memcached, kafka, rabbitmq, nats, mosquitto |
| **Webserver & Proxys** | 6 | nginx, httpd, caddy, haproxy, traefik, envoy |
| **Observability** | 14 | prometheus, alertmanager, victoria-metrics, thanos, mimir, jaeger, loki, tempo, otelcol, fluent-bit, telegraf, node-exporter, blackbox-exporter, pushgateway |
| **Infrastruktur** | 7 | coredns, etcd, openbao, keycloak, qdrant, registry, consul |
| **Kubernetes, CI & IaC** | 4 | helm, kubectl, opentofu, trivy |
| **Apps** | 5 | jenkins, gitea, minio, rails, mailpit |
Durchsuchen Sie jedes Image – mit Live-CVE-Scans, allen Tags, SBOMs und Build-Provenienz – unter **[minimalcontainers.com](https://minimalcontainers.com)** oder erweitern Sie die vollständige Pull-Befehrsliste unten.
<details>
<summary><strong>Vollständiger Image-Katalog mit Pull-Befehlen</strong></summary>
<br>

| Image | Pull-Befehl | Shell | Anwendungsfall |
|-------|--------------|-------|----------|
| | | **Sprachen** | |
| Python | `docker pull ghcr.io/rtvkiz/minimal-python:latest` | Nein | Python-Apps, Microservices |
| Node.js-slim | `docker pull ghcr.io/rtvkiz/minimal-node-slim:latest` | Nein | Node.js-Apps, JavaScript |
| Bun | `docker pull ghcr.io/rtvkiz/minimal-bun:latest` | Nein | Schnelle JavaScript/TypeScript-Laufzeit |
| Go | `docker pull ghcr.io/rtvkiz/minimal-go:latest` | Nein | Go-Entwicklung, CGO-Builds |
| .NET Runtime | `docker pull ghcr.io/rtvkiz/minimal-dotnet:latest` | Nein | .NET 10-Laufzeit für Apps |
| Java | `docker pull ghcr.io/rtvkiz/minimal-java:latest` | Nein | OpenJDK 26 JRE für Java-Apps |
| Ruby | `docker pull ghcr.io/rtvkiz/minimal-ruby:latest` | Nein | Ruby 4.0-Laufzeit (aus Quellen gebaut) |
| PHP | `docker pull ghcr.io/rtvkiz/minimal-php:latest` | Nein | PHP 8.5 CLI (aus Quellen gebaut) |
| Rails | `docker pull ghcr.io/rtvkiz/minimal-rails:latest` | Nein | Ruby 4.0 + Rails 8.1 (aus Quellen gebaut) |
| Deno | `docker pull ghcr.io/rtvkiz/minimal-deno:latest` | Nein | Sichere TypeScript/JavaScript-Laufzeit |
| | | **Datenbanken** | |
| MySQL | `docker pull ghcr.io/rtvkiz/minimal-mysql:latest` | Ja | MySQL LTS 8.4.x, aus Quellen gebaut |
| MariaDB | `docker pull ghcr.io/rtvkiz/minimal-mariadb:latest` | Ja | MariaDB LTS 11.4.x, aus Quellen gebaut |
| PostgreSQL-slim | `docker pull ghcr.io/rtvkiz/minimal-postgres-slim:latest` | Nein | Relationale Datenbank |
| SQLite | `docker pull ghcr.io/rtvkiz/minimal-sqlite:latest` | Nein | Eingebettete SQL-Datenbank-CLI |
| OpenSearch | `docker pull ghcr.io/rtvkiz/minimal-opensearch:latest` | Nein* | OpenSearch 3.x – Suche & Analyse |
| | | **Caches, Warteschlangen, Messaging** | |
| Redis-slim | `docker pull ghcr.io/rtvkiz/minimal-redis-slim:latest` | Nein | In-Memory-Datenspeicher |
| Memcached | `docker pull ghcr.io/rtvkiz/minimal-memcached:latest` | Nein | In-Memory-Caching (aus Quellen gebaut) |
| Valkey | `docker pull ghcr.io/rtvkiz/minimal-valkey:latest` | Nein | BSD-lizenzierter Redis-Fork (LF) |
| Kafka | `docker pull ghcr.io/rtvkiz/minimal-kafka:latest` | Ja | Apache Kafka 4.x, KRaft-Modus |
| RabbitMQ | `docker pull ghcr.io/rtvkiz/minimal-rabbitmq:latest` | Ja | RabbitMQ 4.x AMQP-Broker |
| NATS | `docker pull ghcr.io/rtvkiz/minimal-nats:latest` | Nein | NATS Server mit JetStream |
| Mosquitto | `docker pull ghcr.io/rtvkiz/minimal-mosquitto:latest` | Nein | Eclipse Mosquitto MQTT-Broker (EPL-2.0/EDL-1.0) |
| | | **Webserver & Proxys** | |
| Nginx | `docker pull ghcr.io/rtvkiz/minimal-nginx:latest` | Nein | Reverse Proxy, statische Dateien |
| HTTPD | `docker pull ghcr.io/rtvkiz/minimal-httpd:latest` | Vielleicht* | Apache-Webserver |
| Caddy | `docker pull ghcr.io/rtvkiz/minimal-caddy:latest` | Nein | Automatischer HTTPS-Webserver |
| HAProxy | `docker pull ghcr.io/rtvkiz/minimal-haproxy:latest` | Nein | TCP/HTTP-Lastverteiler |
| Traefik | `docker pull ghcr.io/rtvkiz/minimal-traefik:latest` | Nein | Cloud-nativer Reverse Proxy |
| Envoy | `docker pull ghcr.io/rtvkiz/minimal-envoy:latest` | Nein | Service-Proxy & Lastverteiler |
| | | **Observability** | |
| Prometheus | `docker pull ghcr.io/rtvkiz/minimal-prometheus:latest` | Nein | Metriksammlung & Alarmierung |
| VictoriaMetrics | `docker pull ghcr.io/rtvkiz/minimal-victoria-metrics:latest` | Nein | Hochleistungs-Metrikspeicher |
| Jaeger | `docker pull ghcr.io/rtvkiz/minimal-jaeger:latest` | Nein | Verteiltes Tracing (v2) |
| Loki | `docker pull ghcr.io/rtvkiz/minimal-loki:latest` | Nein | Log-Aggregation (Grafana Labs) |
| Tempo | `docker pull ghcr.io/rtvkiz/minimal-tempo:latest` | Nein | Verteiltes Tracing-Backend (Grafana Labs, AGPL) |
| OTel Collector | `docker pull ghcr.io/rtvkiz/minimal-otelcol:latest` | Nein | OpenTelemetry Collector-Kern |
| Fluent Bit | `docker pull ghcr.io/rtvkiz/minimal-fluent-bit:latest` | Nein | Leichter Log-Prozessor |
| Node Exporter | `docker pull ghcr.io/rtvkiz/minimal-node-exporter:latest` | Nein | Prometheus-Host-Hardware- & Betriebssystemmetriken |
| Blackbox Exporter | `docker pull ghcr.io/rtvkiz/minimal-blackbox-exporter:latest` | Nein | Prometheus-Endpunkt-Prüfung (HTTP/DNS/TCP/ICMP) |
| Pushgateway | `docker pull ghcr.io/rtvkiz/minimal-pushgateway:latest` | Nein | Prometheus-Metrik-Push für Batch-Jobs |
| | | **Infrastruktur** | |
| CoreDNS | `docker pull ghcr.io/rtvkiz/minimal-coredns:latest` | Nein | Kubernetes-Standard-DNS |
| etcd | `docker pull ghcr.io/rtvkiz/minimal-etcd:latest` | Nein | Verteilter Key-Value-Speicher |
| OpenBao | `docker pull ghcr.io/rtvkiz/minimal-openbao:latest` | Nein | Geheimnisverwaltung (Vault-Fork) |
| Keycloak | `docker pull ghcr.io/rtvkiz/minimal-keycloak:latest` | Ja | Identitäts- & Zugriffsverwaltung |
| Qdrant | `docker pull ghcr.io/rtvkiz/minimal-qdrant:latest` | Nein | Vektor-DB für KI/ML (Rust) |
| Registry | `docker pull ghcr.io/rtvkiz/minimal-registry:latest` | Nein | OCI-Distributionsregister (Docker Registry v2), aus Quellen gebaut |
| Consul | `docker pull ghcr.io/rtvkiz/minimal-consul:latest` | Nein | HashiCorp Consul Service Discovery + KV (BUSL-1.1) |
| | | **Kubernetes & CI** | |
| Helm | `docker pull ghcr.io/rtvkiz/minimal-helm:latest` | Nein | Helm 3 CLI für Kubernetes-Chart-Bereitstellung |
| kubectl | `docker pull ghcr.io/rtvkiz/minimal-kubectl:latest` | Nein | kubectl CLI für Kubernetes-Cluster-Operationen |
| | | **Apps** | |
| Jenkins | `docker pull ghcr.io/rtvkiz/minimal-jenkins:latest` | Ja | CI/CD-Automatisierung |
| Gitea | `docker pull ghcr.io/rtvkiz/minimal-gitea:latest` | Ja | Selbstgehosteter Git-Dienst |
| MinIO | `docker pull ghcr.io/rtvkiz/minimal-minio:latest` | Nein | S3-kompatibler Objektspeicher |
| Mailpit | `docker pull ghcr.io/rtvkiz/minimal-mailpit:latest` | Nein | SMTP- & E-Mail-Tests für Entwickler, aus Quellen gebaut |
| | | **KI / ML** | |
| CUDA Python | *deaktiviert* | Nein | Python + CUDA 12.9 + cuDNN 9.10 (Build pausiert, Code beibehalten) |
*\*HTTPD, Jenkins, Kafka, MySQL, OpenSearch, Gitea, Keycloak enthalten eine Shell (`sh`/`busybox`/`bash`) über transitive Wolfi-Abhängigkeiten oder weil der Upstream-Entrypoint dies erfordert. CI behandelt das Vorhandensein einer Shell als informativ.*
</details>
## Schnellstart```bash
# Python app
docker run --rm -v $(pwd):/app ghcr.io/rtvkiz/minimal-python:latest /app/main.py
# Nginx reverse proxy
docker run -d -p 8080:80 ghcr.io/rtvkiz/minimal-nginx:latest
# PostgreSQL
docker run -d -p 5432:5432 -v pgdata:/var/lib/postgresql/data \
ghcr.io/rtvkiz/minimal-postgres-slim:latest
# Redis
docker run -d -p 6379:6379 ghcr.io/rtvkiz/minimal-redis-slim:latest
# Kafka (KRaft mode — auto-initializes storage on first boot)
docker run -d -p 9092:9092 -v kafkadata:/var/kafka/data \
ghcr.io/rtvkiz/minimal-kafka:latest
docker run Beispiele (Node, Go, MySQL, MariaDB, Java, .NET, PHP, Rails, RabbitMQ, Gitea, …)
```bash
docker run --rm -v $(pwd):/app -w /app ghcr.io/rtvkiz/minimal-node-slim:latest index.js
docker run --rm ghcr.io/rtvkiz/minimal-bun:latest --version
docker run --rm -v $(pwd):/app -w /app ghcr.io/rtvkiz/minimal-go:latest build -o /tmp/app .
docker run -d -p 8080:80 ghcr.io/rtvkiz/minimal-httpd:latest
docker run -d -p 8080:8080 -v jenkins_home:/var/jenkins_home ghcr.io/rtvkiz/minimal-jenkins:latest
docker run -d -p 3306:3306 -v mysqldata:/var/lib/mysql ghcr.io/rtvkiz/minimal-mysql:latest
docker run -d -p 11211:11211 ghcr.io/rtvkiz/minimal-memcached:latest
docker run --rm -v $(pwd):/data ghcr.io/rtvkiz/minimal-sqlite:latest /data/mydb.sqlite "SELECT sqlite_version();"
docker run --rm -v $(pwd):/app ghcr.io/rtvkiz/minimal-dotnet:latest /app/myapp.dll
docker run --rm -v $(pwd):/app ghcr.io/rtvkiz/minimal-java:latest -jar /app/myapp.jar
docker run --rm -v $(pwd):/app ghcr.io/rtvkiz/minimal-php:latest /app/index.php
docker run --rm -v $(pwd):/app ghcr.io/rtvkiz/minimal-rails:latest -e "require 'rails'; puts Rails.version"
docker run -d -p 5672:5672 -v rabbitmqdata:/var/lib/rabbitmq ghcr.io/rtvkiz/minimal-rabbitmq:latest
docker run -d -p 3000:3000 -v giteadata:/data/gitea ghcr.io/rtvkiz/minimal-gitea:latest
</details>
## Verwendung in der Produktion
**Auf unveränderliche Versionstags festlegen.** Jedes Image wird mit zwei Tags veröffentlicht:
| Tag | Format | Beispiel | Veränderlich |
|---|---|---|---|
| Version | `VERSION-rEPOCH` | `ghcr.io/rtvkiz/minimal-redis-slim:8.4.1-r0` | Nein |
| Latest | `latest` | `ghcr.io/rtvkiz/minimal-redis-slim:latest` | Ja |
### Dev-Varianten (`:latest-dev`)
Die meisten Images veröffentlichen einen `-dev`-Begleiter, der aus der **gleichen Quelle wie die Produktion** erstellt wird – gleiche Laufzeitversion, gleicher kuratierter Paketsatz – plus eine Shell, Paketmanager, Compiler-Toolchain und image-angepasste Debug-Werkzeuge. Gedacht für CI-Build-Stufen und Debugging im Pod, **nicht für den Produktionseinsatz**.
Typische Verwendung mit mehreren Stufen:
```dockerfile
# syntax=docker/dockerfile:1
FROM ghcr.io/rtvkiz/minimal-redis-slim:latest-dev AS build
COPY --from=ghcr.io/rtvkiz/minimal-redis-slim:latest --chown=root:root /usr/local/bin/redis-server /usr/local/bin/
# ... build steps ...
FROM ghcr.io/rtvkiz/minimal-redis-slim:latest
COPY --from=build /usr/local/bin/redis-server /usr/local/bin/redis-server
``````dockerfile
FROM ghcr.io/rtvkiz/minimal-ruby:latest-dev AS build
WORKDIR /work
COPY Gemfile Gemfile.lock ./
RUN bundle install
FROM ghcr.io/rtvkiz/minimal-ruby:latest
COPY --from=build /work /work
Um eine interaktive Shell zu erhalten, überschreiben Sie den Einstiegspunkt (Entwicklungs-Images behalten den Produktions-Einstiegspunkt für die Drop-in-Kompatibilität bei):```bash docker run -it --entrypoint /bin/sh ghcr.io/rtvkiz/minimal-:latest-dev docker run -it --entrypoint /bin/bash ghcr.io/rtvkiz/minimal-:latest-dev
Dev-Varianten teilen sich die Signatur, SBOM und SLSA-Herkunftspipeline des Produktionsimages. Sie werden **nicht im öffentlichen CVE-Dashboard verfolgt** – sie liefern bewusst eine größere Angriffsfläche aus. Siehe [`.github/SECURITY.md`](https://github.com/rtvkiz/minimal/blob/main/.github/SECURITY.md#dev-variants--dev-tags) für die Richtlinie und [`docs/dev-variants/CONVENTIONS.md`](https://github.com/rtvkiz/minimal/blob/main/docs/dev-variants/CONVENTIONS.md) für die Regeln zur Paketzusammenstellung.
**Heute ausgeliefert:** 57 von 57 Dev-Varianten – jedes Image im Katalog hat jetzt einen `:latest-dev`-Begleiter, der aus derselben Quelle wie die Produktion erstellt wurde.
<details>
<summary><strong>Dev-Varianten-Status pro Image</strong></summary>
<br>
Legende: ✅ liefert `:latest-dev` · 🚧 in Arbeit · 📝 geplant
Kategorien folgen den drei Vorlagen in [`docs/dev-variants/templates/`](https://github.com/rtvkiz/minimal/blob/main/docs/dev-variants/templates) (Laufzeit / Daemon / Server). Die Spalte „Referenz“ zeigt, wo wir Chainguards öffentliches `<image>-public/devConfigs`-Paketset spiegeln; **hausintern** bedeutet, dass Chainguard ein reines Enterprise-Image ausliefert und wir die Dev-Komposition selbst entworfen haben.
| Bild | Kategorie | Referenz | Status |
|---|---|---|---|
| ruby | Laufzeit | Chainguard `ruby-public` | ✅ |
| python | Laufzeit | Chainguard `python-public` | ✅ |
| node-slim | Laufzeit | Chainguard `node-public` | ✅ |
| go | Laufzeit | Chainguard `go-public` | ✅ |
| java | Laufzeit | Chainguard `jdk-public` | ✅ |
| dotnet | Laufzeit | Chainguard `dotnet-runtime-10-public` | ✅ |
| php | Laufzeit | hausintern (Composer zurückgestellt – siehe PR) | ✅ |
| rails | Laufzeit | hausintern (von ruby abgeleitet) | ✅ |
| bun | Laufzeit | hausintern | ✅ |
| deno | Laufzeit | hausintern | ✅ |
| postgres-slim | Daemon | Chainguard `postgres-public` | ✅ |
| mariadb | Daemon | Chainguard `mariadb-public` | ✅ |
| mysql | Daemon | hausintern | ✅ |
| redis-slim | Daemon | Chainguard `redis-public` | ✅ |
| valkey | Daemon | Chainguard `valkey-public` | ✅ |
| memcached | Daemon | hausintern | ✅ |
| sqlite | Daemon | hausintern | ✅ |
| opensearch | Daemon | hausintern | ✅ |
| kafka | Daemon | hausintern | ✅ |
| rabbitmq | Daemon | hausintern | ✅ |
| nats | Daemon | hausintern | ✅ |
| etcd | Daemon | hausintern | ✅ |
| qdrant | Daemon | hausintern | ✅ |
| nginx | Server | Chainguard `nginx-public` | ✅ |
| haproxy | Server | Chainguard `haproxy-public` | ✅ |
| minio | Server | Chainguard `minio-client-public` (Server hausintern) | ✅ |
| httpd | Server | hausintern | ✅ |
| caddy | Server | hausintern | ✅ |
| traefik | Server | hausintern | ✅ |
| envoy | Server | hausintern | ✅ |
| prometheus | Server | hausintern | ✅ |
| victoria-metrics | Server | hausintern | ✅ |
| jaeger | Server | hausintern | ✅ |
| otelcol | Server | hausintern | ✅ |
| loki | Server | hausintern | ✅ |
| fluent-bit | Server | hausintern | ✅ |
| node-exporter | Server | hausintern | ✅ |
| blackbox-exporter | Server | hausintern | ✅ |
| pushgateway | Server | hausintern | ✅ |
| coredns | Server | hausintern | ✅ |
| gitea | Server | hausintern | ✅ |
| jenkins | Server | hausintern | ✅ |
| keycloak | Server | hausintern | ✅ |
| openbao | Server | hausintern | ✅ |
| registry | Server | Chainguard `registry-public` | ✅ |
| mailpit | Server | hausintern (Chainguard liefert kein öffentliches mailpit aus) | ✅ |
| consul | Server | hausintern (Chainguard liefert kein öffentliches consul aus; BUSL-1.1) | ✅ |
| tempo | Server | hausintern (Chainguard liefert kein öffentliches tempo aus; AGPL-3.0) | ✅ |
| mosquitto | Daemon | hausintern (Chainguard liefert kein öffentliches mosquitto aus; EPL-2.0/EDL-1.0) | ✅ |
</details>```dockerfile
# Production Dockerfile — pin by version tag, ideally by digest
FROM ghcr.io/rtvkiz/minimal-go:1.26.0-r0 AS build
WORKDIR /src
COPY . .
RUN go build -o /out/app
FROM ghcr.io/rtvkiz/minimal-python:3.14.0-r0
COPY --from=build /out/app /usr/bin/app
ENTRYPOINT ["/usr/bin/app"]
Signatur + Herkunft in Kubernetes durchsetzen mit sigstore-policy-controller oder Kyverno:```yaml
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: verify-minimal-images spec: validationFailureAction: Enforce rules: - name: check-signature match: any: - resources: kinds: [Pod] verifyImages: - imageReferences: - "ghcr.io/rtvkiz/minimal-" attestors: - entries: - keyless: subject: "https://github.com/rtvkiz/minimal/" issuer: "https://token.actions.githubusercontent.com"
The `-r0` suffix is the revision number — resets to `r0` on each upstream version bump, increments (`r1`, `r2`, …) for rebuilds of the same upstream version (e.g., dependency patches). Old version tags are preserved across rebuilds.
## Build-Pipeline
<details>
<summary><strong>Pipeline-Diagramm</strong></summary>
<br>```
┌─────────────────────────────────────────────────────────────────────────────┐
│ BUILD PIPELINE │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Signing Keys: │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ PRs: keygen job (ephemeral) │ Main: repository secrets (persistent)│ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────┐ ┌─────────────────────────────────────┐ │
│ │ melange-build │ │ build-apko │ │
│ │ Native ARM64 runners │ │ Wolfi pre-built packages │ │
│ │ ┌────────┐ ┌────────────┐ │ │ ┌─────────┐ ┌───────────────┐ │ │
│ │ │ x86_64 │ │ aarch64 │ │ │ │ Wolfi │────►│ apko publish │ │ │
│ │ │ ubuntu │ │ ubuntu-arm │ │ │ │ packages│ │ (multi-arch) │ │ │
│ │ └────┬───┘ └─────┬──────┘ │ │ └─────────┘ └───────┬───────┘ │ │
│ │ └─────┬──────┘ │ │ │ │ │
│ │ ▼ │ └──────────────────────────│──────────┘ │
│ │ ┌──────────────┐ │ │ │
│ │ │ artifacts │ │ │ │
│ │ │ (x86+arm64) │ │ │ │
│ │ └──────┬───────┘ │ │ │
│ └────────────│────────────────┘ │ │
│ ▼ │ │
│ ┌─────────────────────────────┐ │ │
│ │ build-melange │ │ │
│ │ ┌─────────┐ ┌────────────┐ │ │ │
│ │ │ merge │►│ apko │─┼───────────────────────────────┤ │
│ │ │ packages│ │ publish │ │ │ │
│ │ └─────────┘ └────────────┘ │ │ │
│ └─────────────────────────────┘ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Verification & Attestation │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────────────┐ │ │
│ │ │ Grype │─►│ Test │─►│ cosign │─►│ SBOM + SLSA L3 │ │ │
│ │ │ CVE scan │ │ image │ │ sign │ │ attestations │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └─────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ Note: PRs build and test but do not publish. Only main branch publishes. │
└─────────────────────────────────────────────────────────────────────────────┘
| Auslöser | Wann | Zweck |
|---|---|---|
| Geplant | Alle 6 Stunden | Neueste CVE-Patches von Wolfi übernehmen |
| Push | Bei Merge in main | Konfigurationsänderungen bereitstellen |
| Manuell | Workflow-Dispatch | Notfall-Neuaufbauten |
Ergebnisse von Schwachstellenscans erscheinen im Live-Katalog, in der Job-Zusammenfassung und auf dem GitHub-Sicherheitsreiter.
Quellbasierte Images werden von dedizierten Workflows überwacht, die täglich den Upstream prüfen und PRs öffnen:
| Workflow | Überwacht | Funktion |
|---|---|---|
update-jenkins.yml | Jenkins-LTS-Versionen | Aktualisiert Version in Melange-Konfiguration, Makefile, build.yml |
update-redis.yml | Redis GitHub-Releases | Aktualisiert Version und SHA256 |
update-mysql.yml | MySQL LTS (8.4.x) GitHub-Tags | Aktualisiert Version und SHA256 |
update-memcached.yml | Memcached GitHub-Releases | Aktualisiert Version und SHA256 |
update-kafka.yml | Apache Kafka 4.x GitHub-Tags | Aktualisiert Version und SHA512 |
update-php.yml | php.net Releases-API | Aktualisiert Version und SHA256; erstellt Issue für neue Neben-/Hauptserien |
update-rails.yml | RubyGems-API + Ruby GitHub-Tags | Aktualisiert Rails-Gem- und Ruby-Quellversionen unabhängig voneinander |
update-rabbitmq.yml | RabbitMQ GitHub-Releases | Aktualisiert Version und SHA256 |
update-minio.yml | MinIO GitHub-Releases | Aktualisiert Release-Tag, datumsbasierte Version und SHA256 |
update-victoria-metrics.yml | VictoriaMetrics GitHub-Releases | Aktualisiert Version und SHA256 |
update-jaeger.yml | Jaeger v2.x GitHub-Releases | Aktualisiert Version und SHA256; warnt bei Hauptversionswechsel |
update-otelcol.yml | OTel Collector stabile Releases | Aktualisiert Version und SHA256; überspringt Vorabversionen |
update-qdrant.yml | Qdrant v1.x GitHub-Releases | Aktualisiert Version und SHA256 |
update-etcd.yml | etcd v3.x GitHub-Releases | Aktualisiert Version und SHA256 |
update-opensearch.yml | OpenSearch 3.x GitHub-Releases | Aktualisiert Version in Makefile und README |
update-gitea.yml | Gitea v1.x GitHub-Tags | Aktualisiert Version und SHA256 |
Patch-Updates werden automatisch per PR erstellt und von CI validiert. Neben-/Hauptversionssprünge erstellen ein GitHub-Issue mit einer Checkliste für manuelle Upgrades.
| Image | Version | Benutzer | Einstiegspunkt | Arbeitsverzeichnis |
|---|---|---|---|---|
| Python | 3.14.x | nonroot (65532) | /usr/bin/python3 | /app |
| Node.js-slim | 25.x | nonroot (65532) | /usr/bin/dumb-init -- /usr/bin/node | /app |
| Bun | latest | nonroot (65532) | /usr/bin/bun | /app |
| Go | 1.26.x | nonroot (65532) | /usr/bin/go | /app |
| Nginx | mainline | nginx (65532) | /usr/sbin/nginx -g "daemon off;" | / |
| HTTPD | 2.4.x | www-data (65532) | /usr/sbin/httpd -DFOREGROUND | /var/www/localhost/htdocs |
| Jenkins | 2.555.x LTS | jenkins (1000) | tini -- java -jar jenkins.war | /var/jenkins_home |
| Redis | 8.6.x | redis (65532) | /usr/bin/redis-server | / |
| MySQL | 8.4.x | mysql (65532) | /usr/bin/docker-entrypoint.sh | / |
| MariaDB | 11.4.x | mariadb (65532) | /usr/bin/mariadbd | /var/lib/mysql |
| Memcached | 1.6.x | memcached (65532) | /usr/bin/memcached | / |
| PostgreSQL | 18.x | postgres (70) | /usr/bin/postgres | / |
| SQLite | 3.51.x | nonroot (65532) | /usr/bin/sqlite3 | /data |
| .NET Runtime | 10.x |
go install chainguard.dev/apko@latest go install chainguard.dev/melange@latest brew install anchore/grype/grype
make python make test-python
make build
make scan
Siehe das [Makefile](https://github.com/rtvkiz/minimal/blob/main/Makefile) für die vollständige Zielliste.
## Projektstruktur
<details>
<summary><strong>Repository-Aufbau</strong></summary>
<br>```
minimal/
├── <image>/
│ ├── apko/<name>.yaml # final image config
│ ├── melange.yaml # source build (optional)
│ └── test.sh # smoke test
├── .github/
│ ├── SECURITY.md # disclosure policy + verification recipes
│ └── workflows/
│ ├── build.yml # main CI pipeline (6h rebuilds)
│ ├── patch-go-deps.yml # daily Go transitive CVE patching
│ ├── update-<image>.yml # per-image upstream version tracking
│ └── update-wolfi-packages.yml
├── Makefile
├── README.md
├── CONTRIBUTING.md
└── LICENSE
Kürzlich umgesetzt:
cosign verify-attestation.gh attestation verify.Als Nächstes:
Was dieses Projekt nicht ist:
PRs sind willkommen. In CONTRIBUTING.md finden Sie das Build-Setup, die Image-Konventionen und die Checkliste für die lokale Validierung, die ich vor dem Pushen durchführe.
Wenn Sie ein Sicherheitsproblem finden, nutzen Sie bitte die private Schwachstellenmeldung von GitHub anstatt ein öffentliches Issue zu eröffnen. Die Offenlegungsrichtlinie und der Reaktionszeitplan finden Sie in .github/SECURITY.md.
MIT — siehe LICENSE.
Container-Images enthalten Pakete von Wolfi und anderen Quellen, jeweils mit eigenen Lizenzen (Apache-2.0, MIT, GPL, LGPL, BSD usw.). Vollständige Lizenzinformationen finden Sie im SBOM jedes Images:```bash cosign download sbom ghcr.io/rtvkiz/minimal-python:latest | jq '.packages[].licenseConcluded'
update-coredns.yml | CoreDNS v1.x GitHub-Tags | Aktualisiert Version und SHA256 |
update-openbao.yml | OpenBao v2.x GitHub-Tags | Aktualisiert Version und SHA256 |
update-loki.yml | Loki v3.x GitHub-Tags | Aktualisiert Version und SHA256 |
update-fluent-bit.yml | Fluent Bit v5.x GitHub-Tags | Aktualisiert Version und SHA256 |
update-keycloak.yml | Keycloak 26.x GitHub-Tags | Aktualisiert Version und SHA256 |
update-wolfi-packages.yml | Wolfi APKINDEX | Erkennt neue Python-, Node-, Go-, .NET-, Java-, PostgreSQL-, Deno-Versionen |
| nonroot (65532) |
/usr/bin/dotnet |
/app |
| Java | 26.x | nonroot (65532) | /usr/bin/java | /app |
| Ruby | 4.0.x | nonroot (65532) | /usr/bin/ruby | /work |
| PHP | 8.5.x | nonroot (65532) | /usr/bin/php | /app |
| Rails | Ruby 4.0.x + Rails 8.1.x | nonroot (65532) | /usr/bin/ruby | /app |
| Kafka | 4.2.x | kafka (65532) | /usr/bin/kafka-entrypoint.sh | / |
| RabbitMQ | 4.3.x | rabbitmq (65532) | /opt/rabbitmq/sbin/rabbitmq-server | / |
| NATS | latest | nonroot (65532) | /usr/bin/nats-server | / |
| Valkey | latest | nonroot (65532) | /usr/bin/valkey-server | / |
| MinIO | RELEASE.2025-10-15 | minio (65532) | /usr/bin/minio server --console-address :9001 /data | /data |
| OpenSearch | 3.7.0 | opensearch (65532) | /usr/share/opensearch/opensearch-docker-entrypoint.sh | /usr/share/opensearch/data |
| etcd | 3.6.x | nonroot (65532) | /usr/bin/etcd | /var/lib/etcd |
| VictoriaMetrics | 1.142.x | nonroot (65532) | /usr/bin/victoria-metrics | / |
| Jaeger | 2.18.x | nonroot (65532) | /usr/bin/jaeger | / |
| OTel Collector | 0.151.x | nonroot (65532) | /usr/bin/otelcol | / |
| Qdrant | 1.17.x | nonroot (65532) | /usr/bin/qdrant | /qdrant |
| Deno | 2.x | nonroot (65532) | /usr/bin/deno | /app |
| Gitea | 1.26.x | gitea (65532) | /usr/bin/gitea web --config /etc/gitea/app.ini | /var/lib/gitea |
| CoreDNS | 1.14.x | nonroot (65532) | /usr/bin/coredns | / |
| OpenBao | 2.5.x | openbao (65532) | /usr/bin/bao server | /openbao/data |
| Keycloak | 26.6.x | keycloak (65532) | /opt/keycloak/bin/kc.sh start-dev | /opt/keycloak/data |
| Loki | 3.6.x | loki (65532) | /usr/bin/loki | /loki |
| Fluent Bit | 5.0.x | nonroot (65532) | /usr/bin/fluent-bit | / |