
Collezione di immagini container minimali e indurite contro le CVE
Immagini contenitore piccole e indurite, gratuite e con licenza MIT.
Costruite da sorgente con i pacchetti apko di Chainguard e Wolfi, ricostruite ogni sei ore.
Ogni immagine è firmata con cosign, include un'attestazione SPDX SBOM e riporta una provenienza di build SLSA Livello 3. Puoi verificare tutto senza un account.
🌐 Sfoglia il catalogo completo su minimalcontainers.com →
Catalogo immagini · Verifica un'immagine · Tutte e 57 le immagini ·
Il punto di queste immagini è che non devi fidarti di me. Scaricane una e verifica tu stesso la provenienza:```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
Altre ricette di verifica (firma cosign, SBOM, provenienza SLSA) si trovano in [`.github/SECURITY.md`](https://github.com/rtvkiz/minimal/blob/main/.github/SECURITY.md).
## Come `minimal` è diverso
| | minimal | Chainguard | Docker Hardened | Minimus / RapidFort |
|---|:---:|:---:|:---:|:---:|
| **Licenza** | MIT | Proprietario | Apache-2.0 | Proprietario |
| **Costo** | $0 | ~$30k/immagine/anno | Supporto gratuito + a pagamento | Chiamata commerciale |
| **Autenticazione per il pull** | No | Sì | Sì | Sì |
| **Limiti di frequenza** | Nessuno | Sì | Sì | Sì |
| **Ricette di build pubbliche** | Sì, ogni `melange.yaml` | No | Sì, Dockerfile | No |
| **Firma cosign + SBOM + SLSA L3** | Sì | Sì | Sì | Sì |
| **SLA del fornitore, FedRAMP/STIG** | No | Sì (a pagamento) | Sì (a pagamento) | Sì (a pagamento) |
Scegli `minimal` se desideri immagini hardened senza pagare o registrarti, se vuoi leggere ogni ricetta di build dall'inizio alla fine, o se desideri un template funzionante da forkare nel tuo catalogo interno.
Probabilmente non è la scelta giusta se hai bisogno di un contratto con un fornitore, documentazione di accreditamento FedRAMP o STIG, o più di mille immagini dal primo giorno — sono cose reali che questo progetto non cerca di risolvere.
## Cosa include ogni immagine
- Una firma cosign senza chiave, verificabile tramite il registro pubblico di trasparenza Rekor.
- Un SBOM SPDX allegato come attestazione in-toto — ogni pacchetto, versione e licenza.
- Provenienza di build SLSA v1.0 — prova crittografica di quale workflow, quale commit e quale runner ha prodotto l'immagine.
- Una scansione Grype giornaliera, con risultati nel [catalogo pubblico](https://minimalcontainers.com) e nella scheda Sicurezza di GitHub.
- Build native `linux/amd64` e `linux/arm64`.
- Un utente non-root predefinito (UID 65532), a meno che l'upstream non insista diversamente.
- Nessuna shell dove possibile — la maggior parte delle immagini non include `/bin/sh`.
- Una cadenza di rebuild di sei ore, in modo che le patch CVE di Wolfi arrivino in ore, non giorni.
## Immagini disponibili — 57 totali
| Categoria | Conteggio | Punti salienti |
|---|---|---|
| **Linguaggi e runtime** | 9 | python, node-slim, bun, go, java, ruby, php, dotnet, deno |
| **Database** | 5 | mysql, mariadb, postgres-slim, sqlite, opensearch |
| **Cache, code, messaggistica** | 7 | redis-slim, valkey, memcached, kafka, rabbitmq, nats, mosquitto |
| **Server web e proxy** | 6 | nginx, httpd, caddy, haproxy, traefik, envoy |
| **Osservabilità** | 14 | prometheus, alertmanager, victoria-metrics, thanos, mimir, jaeger, loki, tempo, otelcol, fluent-bit, telegraf, node-exporter, blackbox-exporter, pushgateway |
| **Infrastruttura** | 7 | coredns, etcd, openbao, keycloak, qdrant, registry, consul |
| **Kubernetes, CI e IaC** | 4 | helm, kubectl, opentofu, trivy |
| **Applicazioni** | 5 | jenkins, gitea, minio, rails, mailpit |
Sfoglia ogni immagine — con scansioni CVE in tempo reale, tutti i tag, SBOM e provenienza di build — su **[minimalcontainers.com](https://minimalcontainers.com)**, oppure espandi l'elenco completo dei comandi pull qui sotto.
<details>
<summary><strong>Catalogo completo delle immagini con comandi pull</strong></summary>
<br>
| Immagine | Comando pull | Shell | Caso d'uso |
|-------|--------------|-------|----------|
| | | **Linguaggi** | |
| Python | `docker pull ghcr.io/rtvkiz/minimal-python:latest` | No | App Python, microservizi |
| Node.js-slim | `docker pull ghcr.io/rtvkiz/minimal-node-slim:latest` | No | App Node.js, JavaScript |
| Bun | `docker pull ghcr.io/rtvkiz/minimal-bun:latest` | No | Runtime JavaScript/TypeScript veloce |
| Go | `docker pull ghcr.io/rtvkiz/minimal-go:latest` | No | Sviluppo Go, build CGO |
| .NET Runtime | `docker pull ghcr.io/rtvkiz/minimal-dotnet:latest` | No | Runtime .NET 10 per app |
| Java | `docker pull ghcr.io/rtvkiz/minimal-java:latest` | No | OpenJDK 26 JRE per app Java |
| Ruby | `docker pull ghcr.io/rtvkiz/minimal-ruby:latest` | No | Runtime Ruby 4.0 (build da sorgente) |
| PHP | `docker pull ghcr.io/rtvkiz/minimal-php:latest` | No | PHP 8.5 CLI (build da sorgente) |
| Rails | `docker pull ghcr.io/rtvkiz/minimal-rails:latest` | No | Ruby 4.0 + Rails 8.1 (build da sorgente) |
| Deno | `docker pull ghcr.io/rtvkiz/minimal-deno:latest` | No | Runtime TypeScript/JavaScript sicuro |
| | | **Database** | |
| MySQL | `docker pull ghcr.io/rtvkiz/minimal-mysql:latest` | Sì | MySQL LTS 8.4.x, build da sorgente |
| MariaDB | `docker pull ghcr.io/rtvkiz/minimal-mariadb:latest` | Sì | MariaDB LTS 11.4.x, build da sorgente |
| PostgreSQL-slim | `docker pull ghcr.io/rtvkiz/minimal-postgres-slim:latest` | No | Database relazionale |
| SQLite | `docker pull ghcr.io/rtvkiz/minimal-sqlite:latest` | No | CLI per database SQL embedded |
| OpenSearch | `docker pull ghcr.io/rtvkiz/minimal-opensearch:latest` | No* | OpenSearch 3.x — ricerca e analisi |
| | | **Cache, Code, Messaggistica** | |
| Redis-slim | `docker pull ghcr.io/rtvkiz/minimal-redis-slim:latest` | No | Archivio dati in memoria |
| Memcached | `docker pull ghcr.io/rtvkiz/minimal-memcached:latest` | No | Caching in memoria (build da sorgente) |
| Valkey | `docker pull ghcr.io/rtvkiz/minimal-valkey:latest` | No | Fork di Redis con licenza BSD (LF) |
| Kafka | `docker pull ghcr.io/rtvkiz/minimal-kafka:latest` | Sì | Apache Kafka 4.x, modalità KRaft |
| RabbitMQ | `docker pull ghcr.io/rtvkiz/minimal-rabbitmq:latest` | Sì | Broker AMQP RabbitMQ 4.x |
| NATS | `docker pull ghcr.io/rtvkiz/minimal-nats:latest` | No | Server NATS con JetStream |
| Mosquitto | `docker pull ghcr.io/rtvkiz/minimal-mosquitto:latest` | No | Broker MQTT Eclipse Mosquitto (EPL-2.0/EDL-1.0) |
| | | **Server web e proxy** | |
| Nginx | `docker pull ghcr.io/rtvkiz/minimal-nginx:latest` | No | Proxy inverso, file statici |
| HTTPD | `docker pull ghcr.io/rtvkiz/minimal-httpd:latest` | Forse* | Server web Apache |
| Caddy | `docker pull ghcr.io/rtvkiz/minimal-caddy:latest` | No | Server web HTTPS automatico |
| HAProxy | `docker pull ghcr.io/rtvkiz/minimal-haproxy:latest` | No | Bilanciatore di carico TCP/HTTP |
| Traefik | `docker pull ghcr.io/rtvkiz/minimal-traefik:latest` | No | Proxy inverso cloud-native |
| Envoy | `docker pull ghcr.io/rtvkiz/minimal-envoy:latest` | No | Proxy di servizio e bilanciatore di carico |
| | | **Osservabilità** | |
| Prometheus | `docker pull ghcr.io/rtvkiz/minimal-prometheus:latest` | No | Raccolta metriche e alerting |
| VictoriaMetrics | `docker pull ghcr.io/rtvkiz/minimal-victoria-metrics:latest` | No | Archiviazione metriche ad alte prestazioni |
| Jaeger | `docker pull ghcr.io/rtvkiz/minimal-jaeger:latest` | No | Tracciamento distribuito (v2) |
| Loki | `docker pull ghcr.io/rtvkiz/minimal-loki:latest` | No | Aggregazione log (Grafana Labs) |
| Tempo | `docker pull ghcr.io/rtvkiz/minimal-tempo:latest` | No | Backend tracciamento distribuito (Grafana Labs, AGPL) |
| OTel Collector | `docker pull ghcr.io/rtvkiz/minimal-otelcol:latest` | No | Core di OpenTelemetry Collector |
| Fluent Bit | `docker pull ghcr.io/rtvkiz/minimal-fluent-bit:latest` | No | Processore log leggero |
| Node Exporter | `docker pull ghcr.io/rtvkiz/minimal-node-exporter:latest` | No | Metriche hardware e OS host per Prometheus |
| Blackbox Exporter | `docker pull ghcr.io/rtvkiz/minimal-blackbox-exporter:latest` | No | Sondaggio endpoint Prometheus (HTTP/DNS/TCP/ICMP) |
| Pushgateway | `docker pull ghcr.io/rtvkiz/minimal-pushgateway:latest` | No | Push metriche Prometheus per job batch |
| | | **Infrastruttura** | |
| CoreDNS | `docker pull ghcr.io/rtvkiz/minimal-coredns:latest` | No | DNS predefinito Kubernetes |
| etcd | `docker pull ghcr.io/rtvkiz/minimal-etcd:latest` | No | Archivio key-value distribuito |
| OpenBao | `docker pull ghcr.io/rtvkiz/minimal-openbao:latest` | No | Gestione segreti (fork Vault) |
| Keycloak | `docker pull ghcr.io/rtvkiz/minimal-keycloak:latest` | Sì | Gestione identità e accesso |
| Qdrant | `docker pull ghcr.io/rtvkiz/minimal-qdrant:latest` | No | DB vettoriale per AI/ML (Rust) |
| Registry | `docker pull ghcr.io/rtvkiz/minimal-registry:latest` | No | Registry distribuzione OCI (Docker Registry v2), build da sorgente |
| Consul | `docker pull ghcr.io/rtvkiz/minimal-consul:latest` | No | Scoperta servizi e KV HashiCorp Consul (BUSL-1.1) |
| | | **Kubernetes e CI** | |
| Helm | `docker pull ghcr.io/rtvkiz/minimal-helm:latest` | No | CLI Helm 3 per distribuzione chart Kubernetes |
| kubectl | `docker pull ghcr.io/rtvkiz/minimal-kubectl:latest` | No | CLI kubectl per operazioni cluster Kubernetes |
| | | **Applicazioni** | |
| Jenkins | `docker pull ghcr.io/rtvkiz/minimal-jenkins:latest` | Sì | Automazione CI/CD |
| Gitea | `docker pull ghcr.io/rtvkiz/minimal-gitea:latest` | Sì | Servizio Git self-hosted |
| MinIO | `docker pull ghcr.io/rtvkiz/minimal-minio:latest` | No | Archiviazione oggetti compatibile S3 |
| Mailpit | `docker pull ghcr.io/rtvkiz/minimal-mailpit:latest` | No | Test SMTP e email per sviluppatori, build da sorgente |
| | | **AI / ML** | |
| CUDA Python | *disabilitata* | No | Python + CUDA 12.9 + cuDNN 9.10 (build sospesa, codice mantenuto) |
*\*HTTPD, Jenkins, Kafka, MySQL, OpenSearch, Gitea, Keycloak includono una shell (`sh`/`busybox`/`bash`) a causa di dipendenze transitive di Wolfi o perché l'entrypoint upstream lo richiede. CI considera la presenza della shell come informativa.*
</details>
## Avvio rapido```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 (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>
## Utilizzo in produzione
**Blocca a tag di versione immutabili.** Ogni immagine viene pubblicata con due tag:
| Tag | Formato | Esempio | Mutabile |
|---|---|---|---|
| Versione | `VERSIONE-rEPOCH` | `ghcr.io/rtvkiz/minimal-redis-slim:8.4.1-r0` | No |
| Ultima | `latest` | `ghcr.io/rtvkiz/minimal-redis-slim:latest` | Sì |
### Varianti Dev (`:latest-dev`)
La maggior parte delle immagini pubblica una variante `-dev` costruita dalla **stessa sorgente della versione di produzione** — stessa versione runtime, stesso set di pacchetti curato — più una shell, un gestore di pacchetti, una toolchain del compilatore e strumenti di debug appropriati per l'immagine. Pensata per fasi di build CI e debug in-pod, **non per il deployment in produzione**.
Esempio tipico di utilizzo multi-stadio:```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
Per ottenere una shell interattiva, sovrascrivi l'entrypoint (le immagini di sviluppo mantengono l'entrypoint di produzione per compatibilità diretta):```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
Le varianti Dev condividono la pipeline di firma, SBOM e provenienza SLSA dell'immagine prod. **Non sono tracciate nel dashboard pubblico delle CVE** — distribuiscono intenzionalmente una superficie d'attacco più ampia. Vedi [`.github/SECURITY.md`](https://github.com/rtvkiz/minimal/blob/main/.github/SECURITY.md#dev-variants--dev-tags) per la policy e [`docs/dev-variants/CONVENTIONS.md`](https://github.com/rtvkiz/minimal/blob/main/docs/dev-variants/CONVENTIONS.md) per le regole di composizione dei pacchetti.
**Disponibili oggi:** 57 su 57 varianti dev — ogni immagine del catalogo ora offre una controparte `:latest-dev` costruita dalla stessa fonte della versione prod.
<details>
<summary><strong>Stato delle varianti dev per immagine</strong></summary>
<br>
Legenda: ✅ disponibile `:latest-dev` · 🚧 in corso · 📝 pianificato
Le categorie seguono i tre template in [`docs/dev-variants/templates/`](https://github.com/rtvkiz/minimal/blob/main/docs/dev-variants/templates) (runtime / daemon / server). La colonna "Riferimento" mostra dove rispecchiamo il set di pacchetti pubblico di Chainguard `<image>-public/devConfigs`; **in-house** significa che Chainguard distribuisce un'immagine solo Enterprise e abbiamo progettato noi stessi la composizione dev.
| Immagine | Categoria | Riferimento | Stato |
|---|---|---|---|
| ruby | runtime | Chainguard `ruby-public` | ✅ |
| python | runtime | Chainguard `python-public` | ✅ |
| node-slim | runtime | Chainguard `node-public` | ✅ |
| go | runtime | Chainguard `go-public` | ✅ |
| java | runtime | Chainguard `jdk-public` | ✅ |
| dotnet | runtime | Chainguard `dotnet-runtime-10-public` | ✅ |
| php | runtime | interna (composer rimandato — vedi PR) | ✅ |
| rails | runtime | interna (derivata da ruby) | ✅ |
| bun | runtime | interna | ✅ |
| deno | runtime | interna | ✅ |
| postgres-slim | daemon | Chainguard `postgres-public` | ✅ |
| mariadb | daemon | Chainguard `mariadb-public` | ✅ |
| mysql | daemon | interna | ✅ |
| redis-slim | daemon | Chainguard `redis-public` | ✅ |
| valkey | daemon | Chainguard `valkey-public` | ✅ |
| memcached | daemon | interna | ✅ |
| sqlite | daemon | interna | ✅ |
| opensearch | daemon | interna | ✅ |
| kafka | daemon | interna | ✅ |
| rabbitmq | daemon | interna | ✅ |
| nats | daemon | interna | ✅ |
| etcd | daemon | interna | ✅ |
| qdrant | daemon | interna | ✅ |
| nginx | server | Chainguard `nginx-public` | ✅ |
| haproxy | server | Chainguard `haproxy-public` | ✅ |
| minio | server | Chainguard `minio-client-public` (server interno) | ✅ |
| httpd | server | interna | ✅ |
| caddy | server | interna | ✅ |
| traefik | server | interna | ✅ |
| envoy | server | interna | ✅ |
| prometheus | server | interna | ✅ |
| victoria-metrics | server | interna | ✅ |
| jaeger | server | interna | ✅ |
| otelcol | server | interna | ✅ |
| loki | server | interna | ✅ |
| fluent-bit | server | interna | ✅ |
| node-exporter | server | interna | ✅ |
| blackbox-exporter | server | interna | ✅ |
| pushgateway | server | interna | ✅ |
| coredns | server | interna | ✅ |
| gitea | server | interna | ✅ |
| jenkins | server | interna | ✅ |
| keycloak | server | interna | ✅ |
| openbao | server | interna | ✅ |
| registry | server | Chainguard `registry-public` | ✅ |
| mailpit | server | interna (Chainguard non distribuisce mailpit pubblico) | ✅ |
| consul | server | interna (Chainguard non distribuisce consul pubblico; BUSL-1.1) | ✅ |
| tempo | server | interna (Chainguard non distribuisce tempo pubblico; AGPL-3.0) | ✅ |
| mosquitto | daemon | interna (Chainguard non distribuisce mosquitto pubblico; 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"]
Applica firma + provenienza in Kubernetes con sigstore-policy-controller o 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"
Il suffisso `-r0` indica il numero di revisione — viene reimpostato a `r0` ad ogni incremento di versione upstream, e incrementa (`r1`, `r2`, …) per le ricostruzioni della stessa versione upstream (ad esempio, patch di dipendenze). I tag di versione precedenti vengono conservati durante le ricostruzioni.
## Pipeline di build
<details>
<summary><strong>Diagramma della pipeline</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. │
└─────────────────────────────────────────────────────────────────────────────┘
| Attivazione | Quando | Scopo |
|---|---|---|
| Pianificato | Ogni 6 ore | Recupera le ultime patch CVE da Wolfi |
| Caricamento | All'unione in main | Distribuisci modifiche di configurazione |
| Manuale | Lanciato manualmente | Ricostruzioni di emergenza |
I risultati della scansione delle vulnerabilità appaiono nel catalogo live, nel riepilogo del job e nella scheda Sicurezza di GitHub.
Le immagini costruite da sorgente sono monitorate da workflow dedicati che controllano gli upstream quotidianamente e aprono PR:
| Workflow | Monitora | Cosa fa |
|---|---|---|
update-jenkins.yml | Rilasci LTS di Jenkins | Aggiorna la versione in melange config, Makefile, build.yml |
update-redis.yml | Rilasci GitHub di Redis | Aggiorna versione e SHA256 |
update-mysql.yml | Tag GitHub di MySQL LTS (8.4.x) | Aggiorna versione e SHA256 |
update-memcached.yml | Rilasci GitHub di Memcached | Aggiorna versione e SHA256 |
update-kafka.yml | Tag GitHub di Apache Kafka 4.x | Aggiorna versione e SHA512 |
update-php.yml | API dei rilasci di php.net | Aggiorna versione e SHA256; apre un issue per nuove serie minor/major |
update-rails.yml | API RubyGems + tag GitHub di Ruby | Aggiorna le versioni della gemma Rails e della sorgente Ruby indipendentemente |
update-rabbitmq.yml | Rilasci GitHub di RabbitMQ | Aggiorna versione e SHA256 |
update-minio.yml | Rilasci GitHub di MinIO | Aggiorna il tag del rilascio, la versione basata sulla data e SHA256 |
update-victoria-metrics.yml | Rilasci GitHub di VictoriaMetrics | Aggiorna versione e SHA256 |
update-jaeger.yml | Rilasci GitHub di Jaeger v2.x | Aggiorna versione e SHA256; avvisa in caso di cambio di major version |
update-otelcol.yml | Rilasci stabili di OTel Collector | Aggiorna versione e SHA256; salta le prerelease |
update-qdrant.yml | Rilasci GitHub di Qdrant v1.x | Aggiorna versione e SHA256 |
update-etcd.yml | Rilasci GitHub di etcd v3.x | Aggiorna versione e SHA256 |
update-opensearch.yml | Rilasci GitHub di OpenSearch 3.x | Aggiorna la versione in Makefile e README |
update-gitea.yml | Tag GitHub di Gitea v1.x | Aggiorna versione e SHA256 |
Gli aggiornamenti di patch vengono automaticamente PR e validati dalla CI. I salti di minor/major creano un Issue GitHub con una checklist di aggiornamento manuale.
| Immagine | Versione | Utente | Punto di ingresso | Cartella di lavoro |
|---|---|---|---|---|
| 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
Vedi il [Makefile](https://github.com/rtvkiz/minimal/blob/main/Makefile) per l'elenco completo dei target.
## Struttura del progetto
<details>
<summary><strong>Disposizione del repository</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
Appena rilasciati:
cosign verify-attestation.gh attestation verify.Prossimi passi:
Cosa questo progetto non è:
Le PR sono benvenute. CONTRIBUTING.md contiene la configurazione di build, le convenzioni per le immagini e la checklist di validazione locale che eseguo prima di fare push.
Se trovi un problema di sicurezza, utilizza la segnalazione privata delle vulnerabilità di GitHub invece di aprire un issue pubblico. La politica di divulgazione e la tempistica di risposta sono in .github/SECURITY.md.
MIT — vedi LICENSE.
Le immagini contenitore includono pacchetti da Wolfi e altre fonti, ciascuno con le proprie licenze (Apache-2.0, MIT, GPL, LGPL, BSD, ecc.). Le informazioni complete sulla licenza sono nell'SBOM di ciascuna immagine:```bash cosign download sbom ghcr.io/rtvkiz/minimal-python:latest | jq '.packages[].licenseConcluded'
update-coredns.yml | Tag GitHub di CoreDNS v1.x | Aggiorna versione e SHA256 |
update-openbao.yml | Tag GitHub di OpenBao v2.x | Aggiorna versione e SHA256 |
update-loki.yml | Tag GitHub di Loki v3.x | Aggiorna versione e SHA256 |
update-fluent-bit.yml | Tag GitHub di Fluent Bit v5.x | Aggiorna versione e SHA256 |
update-keycloak.yml | Tag GitHub di Keycloak 26.x | Aggiorna versione e SHA256 |
update-wolfi-packages.yml | APKINDEX di Wolfi | Rileva nuove versioni di Python, Node, Go, .NET, Java, PostgreSQL, Deno |
| 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 | / |