
Collection minimale d'images de conteneurs durcies contre les CVE
Images de conteneurs compactes, durcies, gratuites et sous licence MIT.
Construites à partir des sources avec les paquets apko de Chainguard et Wolfi, reconstruites toutes les six heures.
Chaque image est signée avec cosign, inclut une attestation de SBOM SPDX, et possède une provenance de construction SLSA Niveau 3. Vous pouvez tout vérifier sans compte.
🌐 Parcourir le catalogue complet sur minimalcontainers.com →
L'intérêt de ces images est que vous n'avez pas à me faire confiance. Téléchargez-en une, puis vérifiez vous-même la provenance :```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
Plus de recettes de vérification (signature cosign, SBOM, provenance SLSA) se trouvent dans [`.github/SECURITY.md`](https://github.com/rtvkiz/minimal/blob/main/.github/SECURITY.md).
## En quoi `minimal` est différent
| | minimal | Chainguard | Docker Hardened | Minimus / RapidFort |
|---|:---:|:---:|:---:|:---:|
| **Licence** | MIT | Propriétaire | Apache-2.0 | Propriétaire |
| **Coût** | 0 $ | ~30 000 $/image/an | Gratuit + support payant | Appel commercial |
| **Authentification nécessaire pour extraire** | Non | Oui | Oui | Oui |
| **Limites de débit** | Aucune | Oui | Oui | Oui |
| **Recettes de construction publiques** | Oui, chaque `melange.yaml` | Non | Oui, Dockerfiles | Non |
| **Signature Cosign + SBOM + SLSA L3** | Oui | Oui | Oui | Oui |
| **SLA fournisseur, FedRAMP/STIG** | Non | Oui (payant) | Oui (payant) | Oui (payant) |
Optez pour `minimal` si vous voulez des images durcies sans payer ni vous inscrire, si vous voulez lire chaque recette de construction de bout en bout, ou si vous voulez un modèle fonctionnel à forker dans votre propre catalogue interne.
Ce n'est probablement pas le bon choix si vous avez besoin d'un contrat fournisseur, de documents d'accréditation FedRAMP ou STIG, ou de plus d'un millier d'images dès le premier jour — ce sont des besoins réels que ce projet ne cherche pas à résoudre.
## Ce que chaque image embarque
- Une signature keyless Cosign, vérifiable auprès du registre de transparence public Rekor.
- Un SBOM SPDX attaché comme une attestation in-toto — chaque paquet, version et licence.
- Une provenance de construction SLSA v1.0 — preuve cryptographique de quel workflow, quel commit et quel runner a produit l'image.
- Un scan Grype quotidien, avec les résultats dans le [catalogue public](https://minimalcontainers.com) et l'onglet Sécurité GitHub.
- Des constructions natives `linux/amd64` et `linux/arm64`.
- Un utilisateur non-root par défaut (UID 65532), sauf si l'upstream insiste autrement.
- Pas de shell si possible — la plupart des images ne contiennent pas `/bin/sh`.
- Un cycle de reconstruction de six heures, afin que les correctifs de CVE Wolfi arrivent en quelques heures, pas en jours.
## Images disponibles — 57 au total
| Catégorie | Nombre | Points forts |
|---|---|---|
| **Langages & environnements d'exécution** | 9 | python, node-slim, bun, go, java, ruby, php, dotnet, deno |
| **Bases de données** | 5 | mysql, mariadb, postgres-slim, sqlite, opensearch |
| **Caches, files d'attente, messagerie** | 7 | redis-slim, valkey, memcached, kafka, rabbitmq, nats, mosquitto |
| **Serveurs web & proxies** | 6 | nginx, httpd, caddy, haproxy, traefik, envoy |
| **Observabilité** | 14 | prometheus, alertmanager, victoria-metrics, thanos, mimir, jaeger, loki, tempo, otelcol, fluent-bit, telegraf, node-exporter, blackbox-exporter, pushgateway |
| **Infrastructure** | 7 | coredns, etcd, openbao, keycloak, qdrant, registry, consul |
| **Kubernetes, CI & IaC** | 4 | helm, kubectl, opentofu, trivy |
| **Applications** | 5 | jenkins, gitea, minio, rails, mailpit |
Parcourez chaque image — avec des scans CVE en direct, tous les tags, SBOM et provenance de construction — sur **[minimalcontainers.com](https://minimalcontainers.com)**, ou développez la liste complète des commandes d'extraction ci-dessous.
<details>
<summary><strong>Catalogue complet des images avec commandes d'extraction</strong></summary>
<br>
| Image | Commande d'extraction | Shell | Cas d'usage |
|-------|--------------|-------|----------|
| | | **Langages** | |
| Python | `docker pull ghcr.io/rtvkiz/minimal-python:latest` | Non | Applications Python, microservices |
| Node.js-slim | `docker pull ghcr.io/rtvkiz/minimal-node-slim:latest` | Non | Applications Node.js, JavaScript |
| Bun | `docker pull ghcr.io/rtvkiz/minimal-bun:latest` | Non | Environnement d'exécution JavaScript/TypeScript rapide |
| Go | `docker pull ghcr.io/rtvkiz/minimal-go:latest` | Non | Développement Go, constructions CGO |
| .NET Runtime | `docker pull ghcr.io/rtvkiz/minimal-dotnet:latest` | Non | Environnement d'exécution .NET 10 pour applications |
| Java | `docker pull ghcr.io/rtvkiz/minimal-java:latest` | Non | OpenJDK 26 JRE pour applications Java |
| Ruby | `docker pull ghcr.io/rtvkiz/minimal-ruby:latest` | Non | Environnement d'exécution Ruby 4.0 (construit à partir des sources) |
| PHP | `docker pull ghcr.io/rtvkiz/minimal-php:latest` | Non | CLI PHP 8.5 (construit à partir des sources) |
| Rails | `docker pull ghcr.io/rtvkiz/minimal-rails:latest` | Non | Ruby 4.0 + Rails 8.1 (construit à partir des sources) |
| Deno | `docker pull ghcr.io/rtvkiz/minimal-deno:latest` | Non | Environnement d'exécution sécurisé TypeScript/JavaScript |
| | | **Bases de données** | |
| MySQL | `docker pull ghcr.io/rtvkiz/minimal-mysql:latest` | Oui | MySQL LTS 8.4.x, construit à partir des sources |
| MariaDB | `docker pull ghcr.io/rtvkiz/minimal-mariadb:latest` | Oui | MariaDB LTS 11.4.x, construit à partir des sources |
| PostgreSQL-slim | `docker pull ghcr.io/rtvkiz/minimal-postgres-slim:latest` | Non | Base de données relationnelle |
| SQLite | `docker pull ghcr.io/rtvkiz/minimal-sqlite:latest` | Non | CLI de base de données SQL embarquée |
| OpenSearch | `docker pull ghcr.io/rtvkiz/minimal-opensearch:latest` | Non* | OpenSearch 3.x — recherche & analyse |
| | | **Caches, files d'attente, messagerie** | |
| Redis-slim | `docker pull ghcr.io/rtvkiz/minimal-redis-slim:latest` | Non | Stockage de données en mémoire |
| Memcached | `docker pull ghcr.io/rtvkiz/minimal-memcached:latest` | Non | Mise en cache en mémoire (construit à partir des sources) |
| Valkey | `docker pull ghcr.io/rtvkiz/minimal-valkey:latest` | Non | Fork de Redis sous licence BSD (LF) |
| Kafka | `docker pull ghcr.io/rtvkiz/minimal-kafka:latest` | Oui | Apache Kafka 4.x, mode KRaft |
| RabbitMQ | `docker pull ghcr.io/rtvkiz/minimal-rabbitmq:latest` | Oui | Courtier AMQP RabbitMQ 4.x |
| NATS | `docker pull ghcr.io/rtvkiz/minimal-nats:latest` | Non | Serveur NATS avec JetStream |
| Mosquitto | `docker pull ghcr.io/rtvkiz/minimal-mosquitto:latest` | Non | Courtier MQTT Eclipse Mosquitto (EPL-2.0/EDL-1.0) |
| | | **Serveurs web & proxys** | |
| Nginx | `docker pull ghcr.io/rtvkiz/minimal-nginx:latest` | Non | Proxy inverse, fichiers statiques |
| HTTPD | `docker pull ghcr.io/rtvkiz/minimal-httpd:latest` | Peut-être* | Serveur web Apache |
| Caddy | `docker pull ghcr.io/rtvkiz/minimal-caddy:latest` | Non | Serveur web HTTPS automatique |
| HAProxy | `docker pull ghcr.io/rtvkiz/minimal-haproxy:latest` | Non | Équilibreur de charge TCP/HTTP |
| Traefik | `docker pull ghcr.io/rtvkiz/minimal-traefik:latest` | Non | Proxy inverse cloud-native |
| Envoy | `docker pull ghcr.io/rtvkiz/minimal-envoy:latest` | Non | Proxy de service & équilibreur de charge |
| | | **Observabilité** | |
| Prometheus | `docker pull ghcr.io/rtvkiz/minimal-prometheus:latest` | Non | Collecte de métriques & alerting |
| VictoriaMetrics | `docker pull ghcr.io/rtvkiz/minimal-victoria-metrics:latest` | Non | Stockage de métriques haute performance |
| Jaeger | `docker pull ghcr.io/rtvkiz/minimal-jaeger:latest` | Non | Traçage distribué (v2) |
| Loki | `docker pull ghcr.io/rtvkiz/minimal-loki:latest` | Non | Agrégation de logs (Grafana Labs) |
| Tempo | `docker pull ghcr.io/rtvkiz/minimal-tempo:latest` | Non | Backend de traçage distribué (Grafana Labs, AGPL) |
| OTel Collector | `docker pull ghcr.io/rtvkiz/minimal-otelcol:latest` | Non | Cœur du collecteur OpenTelemetry |
| Fluent Bit | `docker pull ghcr.io/rtvkiz/minimal-fluent-bit:latest` | Non | Processeur de logs léger |
| Node Exporter | `docker pull ghcr.io/rtvkiz/minimal-node-exporter:latest` | Non | Métriques matérielles et OS de l'hôte Prometheus |
| Blackbox Exporter | `docker pull ghcr.io/rtvkiz/minimal-blackbox-exporter:latest` | Non | Sondage de points de terminaison Prometheus (HTTP/DNS/TCP/ICMP) |
| Pushgateway | `docker pull ghcr.io/rtvkiz/minimal-pushgateway:latest` | Non | Push de métriques Prometheus pour les tâches batch |
| | | **Infrastructure** | |
| CoreDNS | `docker pull ghcr.io/rtvkiz/minimal-coredns:latest` | Non | DNS par défaut de Kubernetes |
| etcd | `docker pull ghcr.io/rtvkiz/minimal-etcd:latest` | Non | Stockage clé-valeur distribué |
| OpenBao | `docker pull ghcr.io/rtvkiz/minimal-openbao:latest` | Non | Gestion de secrets (fork Vault) |
| Keycloak | `docker pull ghcr.io/rtvkiz/minimal-keycloak:latest` | Oui | Gestion des identités et des accès |
| Qdrant | `docker pull ghcr.io/rtvkiz/minimal-qdrant:latest` | Non | Base de données vectorielle pour IA/ML (Rust) |
| Registry | `docker pull ghcr.io/rtvkiz/minimal-registry:latest` | Non | Registre de distribution OCI (Docker Registry v2), construit à partir des sources |
| Consul | `docker pull ghcr.io/rtvkiz/minimal-consul:latest` | Non | Découverte de services HashiCorp Consul + KV (BUSL-1.1) |
| | | **Kubernetes & CI** | |
| Helm | `docker pull ghcr.io/rtvkiz/minimal-helm:latest` | Non | CLI Helm 3 pour le déploiement de charts Kubernetes |
| kubectl | `docker pull ghcr.io/rtvkiz/minimal-kubectl:latest` | Non | CLI kubectl pour les opérations sur les clusters Kubernetes |
| | | **Applications** | |
| Jenkins | `docker pull ghcr.io/rtvkiz/minimal-jenkins:latest` | Oui | Automatisation CI/CD |
| Gitea | `docker pull ghcr.io/rtvkiz/minimal-gitea:latest` | Oui | Service Git auto-hébergé |
| MinIO | `docker pull ghcr.io/rtvkiz/minimal-minio:latest` | Non | Stockage d'objets compatible S3 |
| Mailpit | `docker pull ghcr.io/rtvkiz/minimal-mailpit:latest` | Non | Test SMTP & email pour développeurs, construit à partir des sources |
| | | **IA / ML** | |
| CUDA Python | *désactivé* | Non | Python + CUDA 12.9 + cuDNN 9.10 (construction suspendue, code conservé) |
*\*HTTPD, Jenkins, Kafka, MySQL, OpenSearch, Gitea, Keycloak incluent un shell (`sh`/`busybox`/`bash`) via des dépendances Wolfi transitives ou parce que le point d'entrée upstream l'exige. La CI traite la présence du shell comme informative.*
</details>
## Démarrage rapide```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 exemples (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>
## Utilisation en production
**Épinglez des tags de version immuables.** Chaque image est publiée avec deux tags :
| Étiquette | Format | Exemple | Modifiable |
|---|---|---|---|
| Version | `VERSION-rEPOCH` | `ghcr.io/rtvkiz/minimal-redis-slim:8.4.1-r0` | Non |
| Dernière | `latest` | `ghcr.io/rtvkiz/minimal-redis-slim:latest` | Oui |
### Variantes Dev (`:latest-dev`)
La plupart des images publient un compagnon `-dev` construit à partir de la **même source que la prod** — même version d’exécution, même ensemble de paquets choisis — plus un shell, un gestionnaire de paquets, une chaîne de compilation et des outils de débogage adaptés à l’image. Destiné aux étapes de construction CI et au débogage dans le pod, **pas pour le déploiement en production**.
Utilisation multi‑étapes typique :```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
Pour obtenir un shell interactif, remplacez le point d'entrée (les images de développement conservent le point d'entrée de production pour une compatibilité directe) :```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
Les variantes Dev partagent la signature, la SBOM et le pipeline de provenance SLSA de l'image de production. Elles ne sont **pas suivies sur le tableau de bord CVE public** — elles offrent intentionnellement une surface d'attaque plus large. Voir [`.github/SECURITY.md`](https://github.com/rtvkiz/minimal/blob/main/.github/SECURITY.md#dev-variants--dev-tags) pour la politique et [`docs/dev-variants/CONVENTIONS.md`](https://github.com/rtvkiz/minimal/blob/main/docs/dev-variants/CONVENTIONS.md) pour les règles de composition des paquets.
**Fourni aujourd'hui :** 57 variantes Dev sur 57 — chaque image du catalogue fournit désormais un compagnon `:latest-dev` construit à partir de la même source que la version de production.
<details>
<summary><strong>État des variantes Dev par image</strong></summary>
<br>
Légende : ✅ fournit `:latest-dev` · 🚧 en cours · 📝 planifié
Les catégories suivent les trois modèles dans [`docs/dev-variants/templates/`](https://github.com/rtvkiz/minimal/blob/main/docs/dev-variants/templates) (runtime / démon / serveur). La colonne « Référence » indique où nous reflétons l'ensemble de paquets public `<image>-public/devConfigs` de Chainguard ; **interne** signifie que Chainguard fournit une image réservée à l'Enterprise et que nous avons conçu nous-mêmes la composition Dev.
| Image | Catégorie | Référence | Statut |
|---|---|---|---|
| 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 | interne (composant reporté — voir la PR) | ✅ |
| rails | runtime | interne (dérivé de ruby) | ✅ |
| bun | runtime | interne | ✅ |
| deno | runtime | interne | ✅ |
| postgres-slim | démon | Chainguard `postgres-public` | ✅ |
| mariadb | démon | Chainguard `mariadb-public` | ✅ |
| mysql | démon | interne | ✅ |
| redis-slim | démon | Chainguard `redis-public` | ✅ |
| valkey | démon | Chainguard `valkey-public` | ✅ |
| memcached | démon | interne | ✅ |
| sqlite | démon | interne | ✅ |
| opensearch | démon | interne | ✅ |
| kafka | démon | interne | ✅ |
| rabbitmq | démon | interne | ✅ |
| nats | démon | interne | ✅ |
| etcd | démon | interne | ✅ |
| qdrant | démon | interne | ✅ |
| nginx | serveur | Chainguard `nginx-public` | ✅ |
| haproxy | serveur | Chainguard `haproxy-public` | ✅ |
| minio | serveur | Chainguard `minio-client-public` (serveur en interne) | ✅ |
| httpd | serveur | interne | ✅ |
| caddy | serveur | interne | ✅ |
| traefik | serveur | interne | ✅ |
| envoy | serveur | interne | ✅ |
| prometheus | serveur | interne | ✅ |
| victoria-metrics | serveur | interne | ✅ |
| jaeger | serveur | interne | ✅ |
| otelcol | serveur | interne | ✅ |
| loki | serveur | interne | ✅ |
| fluent-bit | serveur | interne | ✅ |
| node-exporter | serveur | interne | ✅ |
| blackbox-exporter | serveur | interne | ✅ |
| pushgateway | serveur | interne | ✅ |
| coredns | serveur | interne | ✅ |
| gitea | serveur | interne | ✅ |
| jenkins | serveur | interne | ✅ |
| keycloak | serveur | interne | ✅ |
| openbao | serveur | interne | ✅ |
| registry | serveur | Chainguard `registry-public` | ✅ |
| mailpit | serveur | interne (Chainguard ne fournit pas de mailpit public) | ✅ |
| consul | serveur | interne (Chainguard ne fournit pas de consul public ; BUSL-1.1) | ✅ |
| tempo | serveur | interne (Chainguard ne fournit pas de tempo public ; AGPL-3.0) | ✅ |
| mosquitto | démon | interne (Chainguard ne fournit pas de mosquitto public ; 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"]
Appliquer la signature + la provenance dans Kubernetes avec sigstore-policy-controller ou 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"
Le suffixe `-r0` correspond au numéro de révision — il revient à `r0` à chaque augmentation de version amont, puis s'incrémente (`r1`, `r2`, …) pour les reconstructions de la même version amont (par exemple, correctifs de dépendances). Les anciennes étiquettes de version sont conservées lors des reconstructions.
## Pipeline de construction
<details>
<summary><strong>Diagramme du 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. │
└─────────────────────────────────────────────────────────────────────────────┘
| Déclencheur | Quand | Objectif |
|---|---|---|
| Planifié | Toutes les 6 heures | Récupérer les derniers correctifs CVE de Wolfi |
| Push | Lors d'un merge vers main | Déployer les changements de configuration |
| Manuel | Dispatch de workflow | Reconstructions d'urgence |
Les résultats des analyses de vulnérabilités apparaissent dans le catalogue en direct, le résumé du job et l'onglet GitHub Security.
Les images construites à partir de sources sont suivies par des workflows dédiés qui vérifient les sources amont quotidiennement et ouvrent des PRs :
| Workflow | Surveille | Ce qu'il fait |
|---|---|---|
update-jenkins.yml | Versions LTS de Jenkins | Met à jour la version dans la configuration melange, le Makefile, build.yml |
update-redis.yml | Versions GitHub de Redis | Met à jour la version et le SHA256 |
update-mysql.yml | Tags GitHub MySQL LTS (8.4.x) | Met à jour la version et le SHA256 |
update-memcached.yml | Versions GitHub de Memcached | Met à jour la version et le SHA256 |
update-kafka.yml | Tags GitHub Apache Kafka 4.x | Met à jour la version et le SHA512 |
update-php.yml | API de versions de php.net | Met à jour la version et le SHA256 ; ouvre un ticket pour les nouvelles séries mineures/majeures |
update-rails.yml | API RubyGems + Tags GitHub Ruby | Met à jour indépendamment les versions du gem Rails et de Ruby |
update-rabbitmq.yml | Versions GitHub de RabbitMQ | Met à jour la version et le SHA256 |
update-minio.yml | Versions GitHub de MinIO | Met à jour le tag de release, la version basée sur la date et le SHA256 |
update-victoria-metrics.yml | Versions GitHub de VictoriaMetrics | Met à jour la version et le SHA256 |
update-jaeger.yml | Versions GitHub de Jaeger v2.x | Met à jour la version et le SHA256 ; prévient en cas de changement de version majeure |
update-otelcol.yml | Versions stables de l'OTel Collector | Met à jour la version et le SHA256 ; ignore les pré‑versions |
update-qdrant.yml | Versions GitHub de Qdrant v1.x | Met à jour la version et le SHA256 |
update-etcd.yml | Versions GitHub d'etcd v3.x | Met à jour la version et le SHA256 |
update-opensearch.yml | Versions GitHub d'OpenSearch 3.x | Met à jour la version dans le Makefile et le README |
Les mises à jour de correctifs sont automatiquement PRées et validées par la CI. Les montées de versions mineures/majeures créent un ticket GitHub avec une checklist de mise à niveau manuelle.
| Image | Version | Utilisateur | Point d'entrée | Répertoire de travail |
|---|---|---|---|---|
| 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
See the [Makefile](https://github.com/rtvkiz/minimal/blob/main/Makefile) for the full target list.
## Structure du projet
<details>
<summary><strong>Organisation du dépôt</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
Récemment mis en œuvre :
cosign verify-attestation.gh attestation verify.À venir :
Ce que ce projet n'est pas :
Les PR sont les bienvenues. CONTRIBUTING.md contient la configuration de construction, les conventions d'image et la liste de contrôle de validation locale que j'exécute avant de pousser.
Si vous trouvez un problème de sécurité, veuillez utiliser le rapport de vulnérabilité privé de GitHub plutôt que d'ouvrir un problème public. La politique de divulgation et le calendrier de réponse se trouvent dans .github/SECURITY.md.
MIT — voir LICENSE.
Les images de conteneurs incluent des paquets provenant de Wolfi et d'autres sources, chacun avec ses propres licences (Apache-2.0, MIT, GPL, LGPL, BSD, etc.). Les informations complètes sur la licence se trouvent dans le SBOM de chaque image :```bash cosign download sbom ghcr.io/rtvkiz/minimal-python:latest | jq '.packages[].licenseConcluded'
update-gitea.yml| Tags GitHub de Gitea v1.x |
| Met à jour la version et le SHA256 |
update-coredns.yml | Tags GitHub de CoreDNS v1.x | Met à jour la version et le SHA256 |
update-openbao.yml | Tags GitHub d'OpenBao v2.x | Met à jour la version et le SHA256 |
update-loki.yml | Tags GitHub de Loki v3.x | Met à jour la version et le SHA256 |
update-fluent-bit.yml | Tags GitHub de Fluent Bit v5.x | Met à jour la version et le SHA256 |
update-keycloak.yml | Tags GitHub de Keycloak 26.x | Met à jour la version et le SHA256 |
update-wolfi-packages.yml | APKINDEX de Wolfi | Détecte les nouvelles versions de 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 | / |