sng registry
Fonctionnalité en cours de déploiement. L'interface décrite ici est celle de la prochaine livraison : elle peut encore évoluer, et n'est pas forcément activée sur votre tenant.
Les commandes sng registry sont en cours de diffusion dans la CLI.
Le groupe sng registry pousse, tire, construit et supprime des images dans le registre de
votre tenant, <cluster>.registry.dev.stackngo.fr (par exemple ovh-gra-0.registry.dev.stackngo.fr). Les images vivent sous
<registre>/<tenant>/<dépôt>:<tag> ; vous ne donnez que <dépôt>:<tag>, sng ajoute le
registre et le tenant. L'authentification utilise votre session de tenant : il n'existe pas
de mot de passe du registre.
Les flags globaux (--config, --json, -v, --version) sont décrits dans
l'index de la CLI.
Prérequis communs : sng sso login (sinon not authenticated: run `sng sso login` ), puis
une session de tenant sng tenant use NAME (sinon tenant session required: run `sng tenant use NAME` ).
Flag de groupe :
| Flag | Type | Défaut | Description |
|---|---|---|---|
--tenant | string | tenant courant | tenant visé par pull, build, login, delete d'une image et `access-key credentials |
Référence d'image (REPO[:TAG|@DIGEST]) : REPO est un seul composant en minuscules
(a-z, 0-9, séparateurs ., _, -), sans /. Sans tag ni digest, le tag est latest.
Sinon : invalid repository "…": one lowercase component (a-z, 0-9, . _ -), no slash.
Hôte du registre : celui du cluster choisi par sng config use-cluster <cluster> (clé
registry_url de la configuration de sng, par exemple ovh-gra-0.registry.dev.stackngo.fr), remplacé par la variable
STNG_REGISTRY_URL. Sans cluster choisi, la commande échoue avec
registry host unknown: run "sng config use-cluster <cluster>". Un hôte autre que localhost
doit être en HTTPS. Le registre d'un autre cluster n'est pas utilisable avec la session du
cluster courant : relancez sng config use-cluster.
Actions IAM :
| Commande | Action IAM | Ressource |
|---|---|---|
create | deploy:write (écriture de l'état désiré) | POST /v1/apply |
build (dépôt à créer) | deploy:read et deploy:write | resource/RegistryRepository/<dépôt> |
delete REPO | deploy:delete | DELETE /v1/resources/RegistryRepository/{name} |
build | registry:push (et registry:pull) | repository/<dépôt> |
pull | registry:pull | repository/<dépôt> |
delete REPO:TAG, delete REPO@DIGEST | registry:delete | repository/<dépôt> |
login | session valide (aucune action particulière) | — |
access-key credentials NAME | registry:admin | accesskey/<nom> |
access-key rotate NAME | registry:rotate | accesskey/<nom> |
Un refus du registre est expliqué ainsi :
registry refused the access (401): the repository must be declared (sng registry create NAME) and a policy of the tenant must allow registry:pull / registry:push / registry:delete (sng tenant policy list); if the session expired, run `sng tenant use NAME`: …
sng registry create
sng registry create NAME [--description TEXT] [--public] [--keep-last N] [--keep-days N]
[--keep-tag REGEX]... [--keep-untagged] [--deletion-policy Block|Delete] [--dry-run]
Écrit un manifeste RegistryRepository
dans l'état désiré du tenant (tenant courant), puis la plateforme l'applique.
Jusque-là, le registre refuse tout accès au dépôt. Relancer la commande sur un nom existant
remplace sa déclaration.
| Argument | Description |
|---|---|
NAME | nom du dépôt |
| Flag | Type | Défaut | Description |
|---|---|---|---|
--description | string | description libre, 512 caractères au plus | |
--public | bool | false | autorise le pull anonyme |
--keep-last | int | 0 | garde les N derniers tags poussés (0 à 100 000) |
--keep-days | int | 0 | garde les tags poussés depuis N jours (0 à 3650) |
--keep-tag | string, répétable | garde les tags qui correspondent à cette regex Go (16 au plus) | |
--keep-untagged | bool | false | garde les images sans tag (effacées par défaut) |
--deletion-policy | string | Block | Block ou Delete (insensible à la casse) : purge des images à la suppression du dépôt |
--dry-run | bool | false | affiche le manifeste sans l'appliquer |
Sans aucun flag de rétention, le manifeste n'a pas de retention : tous les tags sont gardés.
sng registry create web --keep-last 20 --keep-days 90 --keep-tag '^v\d+\.\d+\.\d+$'
sng registry create docs --public
sng registry create scratch --deletion-policy Delete --dry-run
repository "web" declared in tenant acme: … usable as ovh-gra-0.registry.dev.stackngo.fr/acme/web
--dry-run :
apiVersion: registry.stackngo.io/v1alpha1
kind: RegistryRepository
metadata:
name: scratch
spec:
deletionPolicy: Delete
Sortie --json : {"uploads": [{"key": "acme/…/RegistryRepository/web.yml", "kind": "RegistryRepository", "name": "web", …}]}.
Erreurs :
| Message | Cause |
|---|---|
--keep-last must be between 0 and 100000 | valeur hors bornes (idem --keep-days, 0 à 3650) |
--keep-tag is limited to 16 expressions | plus de 16 --keep-tag |
--keep-tag "…": error parsing regexp: … | expression invalide |
--deletion-policy "…": expected Block or Delete | valeur inconnue |
--description is limited to 512 characters | description trop longue |
Avec --tenant NAME, le dépôt est déclaré dans NAME et le message affiche son adresse dans
ce tenant.
sng registry pull
sng registry pull REPO[:TAG|@DIGEST] [-o FILE]
Tire une image et la charge dans le démon docker local, ou l'écrit dans une archive
chargeable par docker load.
| Argument | Description |
|---|---|
REPO[:TAG|@DIGEST] | image du tenant |
| Flag | Type | Défaut | Description |
|---|---|---|---|
-o, --output | string | écrit une archive au lieu de charger l'image dans le démon |
sng registry pull web:1.2.0
sng registry pull web:1.2.0 --output web.tar
sng registry pull web@sha256:4f1c9a…
pulled ovh-gra-0.registry.dev.stackngo.fr/acme/web@sha256:4f1c9a…
saved ovh-gra-0.registry.dev.stackngo.fr/acme/web@sha256:4f1c9a… to web.tar
Sortie --json : {"reference": "…", "digest": "sha256:…", "output": "web.tar"} (output vide sans --output).
Erreur : not found in the registry: … (tag ou digest inconnu).
sng registry delete
sng registry delete REPO:TAG | REPO@DIGEST | REPO [--yes]
- Avec un tag ou un digest : supprime l'image du registre (
registry:delete). Un tag est d'abord résolu en digest : tous les tags qui pointent vers la même image disparaissent avec elle. - Avec
REPOseul : retire le manifesteRegistryRepositoryde l'état désiré. Après application par la plateforme, les images sont purgées sideletionPolicyvautDelete; avecBlock, le dépôt reste tant qu'il contient des tags.
| Argument | Description |
|---|---|
REPO:TAG, REPO@DIGEST ou REPO | image ou dépôt |
| Flag | Type | Défaut | Description |
|---|---|---|---|
-y, --yes | bool | false | confirme sans invite ; obligatoire hors terminal interactif |
sng registry delete web:1.0.0
sng registry delete web@sha256:4f1c9a…
sng registry delete scratch --yes
deleted ovh-gra-0.registry.dev.stackngo.fr/acme/web@sha256:4f1c9a…
deleted: acme/…/RegistryRepository/scratch.yml (… images are purged if deletionPolicy is Delete)
Sortie --json : {"reference": "…", "digest": "sha256:…"} pour une image ; la réponse de l'API de suppression (key, …) pour un dépôt.
Erreurs : confirmation requise : relancez avec --yes ou depuis un terminal interactif, opération annulée (réponse autre que « oui »), invalid repository "…". Avec --tenant NAME, l'image ou le dépôt supprimé est celui de NAME, et la confirmation le rappelle.
sng registry build
sng registry build [CONTEXT] [-t REPO[:TAG]] [-f DOCKERFILE] [--platform P,...] [--build-arg K=V]...
[--target STAGE] [--no-push] [--no-scan] [--registry-scan] [--severity S] [--fail-on S]
[--scan-timeout D]
sng registry build --from-image IMAGE [-t REPO[:TAG]]
sng registry build --from-tar FILE -t REPO[:TAG]
Construit CONTEXT (défaut .) avec docker buildx build, pousse l'image vers
<registre>/<tenant>/REPO:TAG avec votre session (docker est configuré comme par
sng registry login), puis analyse ses vulnérabilités sur votre machine avec
Trivy (commande trivy, à installer vous-même) : l'image poussée est analysée par
son digest, avec votre session.
Nom par défaut : sans -t, le dépôt porte le nom du dossier courant (en minuscules, les
séparateurs devenant -) et le tag est latest.
Dépôt créé automatiquement : si le dépôt n'est pas encore déclaré, sng registry build le
déclare lui-même (réglages par défaut : tous les tags gardés, privé, suppression bloquée tant
qu'il contient des images), attend qu'il soit prêt (3 minutes au plus), puis pousse. Avec
--no-push, le registre n'est pas touché. Sans droit pour déclarer le dépôt :
droits insuffisants ; si le dépôt existe mais que le push est refusé : missing rights (policy registry:push).
Pousser une image existante, sans reconstruire :
--from-image IMAGEpousse une image du démon docker local. Sans-t, le dernier composant du nom et son tag sont repris (ghcr.io/acme/tool:3→tool:3).--from-tar FILE -t REPO[:TAG]pousse une archive (docker saveou archive OCI) ;-test obligatoire.
Ces deux options sont incompatibles avec CONTEXT, -f, --platform, --build-arg,
--target et --no-push. Elles créent le dépôt et affichent les mêmes messages que la
construction ; l'analyse des vulnérabilités reste disponible. --from-image s'appuie sur
docker save : docker reste nécessaire. Cela remplace l'ancienne commande
sng registry push, retirée.
trivyabsent : l'image est poussée, un avertissement s'affiche (warning: CVE scan skipped: trivy is not installed …) et la commande réussit. Avec--fail-on, elle sort en erreur, puisque rien n'a été analysé.--registry-scan: attend l'analyse faite par le registre au lieu detrivy(jusqu'à--scan-timeout). Le registre de la plateforme n'analyse pas encore les images : cette option est prévue pour la suite.--no-scan: aucune analyse.--no-push: l'image est chargée dans le démon local et analysée partrivys'il est installé.
| Argument | Description |
|---|---|
CONTEXT | dossier de build (défaut .) |
| Flag | Type | Défaut | Description |
|---|---|---|---|
-t, --tag | string | nom du dossier courant, tag latest | cible REPO[:TAG] dans le tenant ; un digest est refusé ; obligatoire avec --from-tar |
--from-image | string | pousse cette image du démon local au lieu de construire | |
--from-tar | string | pousse cette archive au lieu de construire | |
-f, --file | string | CONTEXT/Dockerfile | chemin du Dockerfile |
--platform | liste | plateformes cibles, ex. linux/amd64,linux/arm64 | |
--build-arg | string, répétable | variable de build KEY=VALUE | |
--target | string | étape de build visée | |
--no-push | bool | false | charge l'image dans le démon local au lieu de la pousser (une seule --platform) |
--no-scan | bool | false | pas d'analyse de vulnérabilités |
--registry-scan | bool | false | attend l'analyse du registre au lieu de l'analyse locale par trivy |
--severity | string | HIGH | sévérité minimale listée : UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL |
--fail-on | string | sort en erreur si une vulnérabilité de cette sévérité ou plus est trouvée (ou si aucune analyse n'a pu avoir lieu) | |
--scan-timeout | durée | 5m | avec --registry-scan : attente maximale de l'analyse du registre |
sng registry build # dépôt = nom du dossier, tag latest
sng registry build -t web:1.2.0 # poussée, puis analyse locale avec trivy
sng registry build ./api -f api/Dockerfile -t api:$(git rev-parse --short HEAD) --fail-on CRITICAL
sng registry build -t web:dev --no-push --fail-on CRITICAL # sans poussée, analyse locale
sng registry build -t web:1.2.0 --no-scan
sng registry build --from-image ghcr.io/acme/tool:3 # pousse tool:3 sans construire
sng registry build --from-tar image.tar -t web:1.2.0
pushed ovh-gra-0.registry.dev.stackngo.fr/acme/web:1.2.0@sha256:4f1c9a…
La ligne pushed est suivie du rapport de trivy (vulnérabilités de sévérité --severity ou
plus).
Sortie --json : {"reference": "…", "digest": "sha256:…"} ; l'analyse locale n'affiche alors
rien, mais --fail-on s'applique toujours. Avec --registry-scan, le rapport du registre est
ajouté.
Erreurs :
| Message | Cause |
|---|---|
--from-tar needs -t REPO[:TAG] | --from-tar sans -t |
-t needs a tag, not a digest | -t web@sha256:… |
docker is required for sng registry build (docker buildx) | docker absent du PATH |
--no-push loads into the local daemon, which holds one platform: pass a single --platform | plusieurs plateformes avec --no-push |
--build-arg "…": expected KEY=VALUE | argument mal formé |
invalid severity "…": expected one of UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL | --severity ou --fail-on inconnu |
warning: CVE scan skipped: trivy is not installed (install it, or use --registry-scan) | image poussée, trivy absent (avertissement, pas une erreur) |
image pushed, but --fail-on needs a CVE scan: install trivy, or use --registry-scan | --fail-on sans trivy : l'image est poussée, la commande sort en erreur |
CVE scan skipped: the image is not in the registry and trivy is not installed … | --no-push sans trivy local (avertissement, pas une erreur) |
sng registry login
sng registry login
Configure docker pour qu'il s'authentifie avec votre session : ajoute
credHelpers["ovh-gra-0.registry.dev.stackngo.fr"] = "sng" dans ~/.docker/config.json (ou
$DOCKER_CONFIG/config.json), en conservant le reste du fichier, et rend
docker-credential-sng (un lien vers sng) trouvable. Aucun mot de passe n'est stocké :
l'assistant renvoie la session courante et la renouvelle si besoin. La session est vérifiée
auprès du registre avant toute écriture.
Docker lance l'assistant sans les flags de sng : il lit la configuration par défaut, ou le
fichier désigné par STNG_CONFIG.
| Flag | Type | Défaut | Description |
|---|---|---|---|
| (aucun flag propre) |
sng registry login
docker now authenticates to ovh-gra-0.registry.dev.stackngo.fr with the session of tenant "acme"
Si le lien n'est pas dans le PATH, un avertissement est écrit sur la sortie d'erreur :
warning: docker-credential-sng is not in PATH; add <dossier> to PATH so docker finds it.
Si le lien ne peut pas être créé : create <chemin> (run `sudo make install`, or link it yourself): ….
Sortie --json : {"registry": "ovh-gra-0.registry.dev.stackngo.fr", "dockerConfig": "/home/me/.docker/config.json", "tenant": "acme"}.
sng registry access-key credentials
sng registry access-key credentials NAME [--show-password]
Affiche les identifiants courants d'une clé d'accès au registre
(RegistryAccessKey), pour un job de CI ou un outil qui ne peut pas ouvrir de session de
tenant. Le nom d'utilisateur (accesskey/<tenant>/<nom>) est toujours affiché ; le mot de
passe seulement avec --show-password. Il change à chaque renouvellement de la clé ; l'ancien
reste accepté pendant sa période de grâce (graceHours, 24 h par défaut).
Réservé aux administrateurs du tenant (action registry:admin).
| Flag | Type | Défaut | Description |
|---|---|---|---|
--show-password | bool | false | affiche aussi le mot de passe (sensible : le garder hors des journaux) |
sng registry access-key credentials builder
username: accesskey/acme/builder
password: (hidden, add --show-password to print it)
Un nom invalide est refusé avant tout appel : invalid access key name "…".
Sortie --json : {"name": "builder", "username": "accesskey/acme/builder"}, avec la clé
password seulement si --show-password est donné.
sng registry access-key rotate
sng registry access-key rotate NAME
Demande un nouveau mot de passe pour une clé d'accès au registre,
sans attendre rotateEveryDays. L'ancien reste accepté pendant la période de grâce de la clé
(graceHours, 24 h par défaut). Lisez le nouveau avec sng registry access-key credentials.
La clé de pull par défaut est gérée par la plateforme et ne se renouvelle pas ici. Réservé aux
administrateurs du tenant (action registry:rotate).
sng registry access-key rotate builder
rotation requested for builder: the previous password stays valid during the grace period
read the new one with: sng registry access-key credentials builder --show-password
Un renouvellement déjà en cours renvoie une erreur : réessayez dans un instant.
Voir aussi
- Guides : Vue d'ensemble, Dépôts et rétention, Pousser et tirer des images, Clés d'accès au registre
- Référence :
RegistryRepository,RegistryAccessKey