Aller au contenu principal

sng registry

Bêta

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 :

FlagTypeDéfautDescription
--tenantstringtenant couranttenant 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 :

CommandeAction IAMRessource
createdeploy:write (écriture de l'état désiré)POST /v1/apply
build (dépôt à créer)deploy:read et deploy:writeresource/RegistryRepository/<dépôt>
delete REPOdeploy:deleteDELETE /v1/resources/RegistryRepository/{name}
buildregistry:push (et registry:pull)repository/<dépôt>
pullregistry:pullrepository/<dépôt>
delete REPO:TAG, delete REPO@DIGESTregistry:deleterepository/<dépôt>
loginsession valide (aucune action particulière)—
access-key credentials NAMEregistry:adminaccesskey/<nom>
access-key rotate NAMEregistry:rotateaccesskey/<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.

ArgumentDescription
NAMEnom du dépôt
FlagTypeDéfautDescription
--descriptionstringdescription libre, 512 caractères au plus
--publicboolfalseautorise le pull anonyme
--keep-lastint0garde les N derniers tags poussés (0 à 100 000)
--keep-daysint0garde les tags poussés depuis N jours (0 à 3650)
--keep-tagstring, répétablegarde les tags qui correspondent à cette regex Go (16 au plus)
--keep-untaggedboolfalsegarde les images sans tag (effacées par défaut)
--deletion-policystringBlockBlock ou Delete (insensible à la casse) : purge des images à la suppression du dépôt
--dry-runboolfalseaffiche 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 :

MessageCause
--keep-last must be between 0 and 100000valeur hors bornes (idem --keep-days, 0 à 3650)
--keep-tag is limited to 16 expressionsplus de 16 --keep-tag
--keep-tag "…": error parsing regexp: …expression invalide
--deletion-policy "…": expected Block or Deletevaleur inconnue
--description is limited to 512 charactersdescription 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.

ArgumentDescription
REPO[:TAG|@DIGEST]image du tenant
FlagTypeDéfautDescription
-o, --outputstringé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 REPO seul : retire le manifeste RegistryRepository de l'état désiré. Après application par la plateforme, les images sont purgées si deletionPolicy vaut Delete ; avec Block, le dépôt reste tant qu'il contient des tags.
ArgumentDescription
REPO:TAG, REPO@DIGEST ou REPOimage ou dépôt
FlagTypeDéfautDescription
-y, --yesboolfalseconfirme 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 IMAGE pousse 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 save ou archive OCI) ; -t est 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.

  • trivy absent : 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 de trivy (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 par trivy s'il est installé.
ArgumentDescription
CONTEXTdossier de build (défaut .)
FlagTypeDéfautDescription
-t, --tagstringnom du dossier courant, tag latestcible REPO[:TAG] dans le tenant ; un digest est refusé ; obligatoire avec --from-tar
--from-imagestringpousse cette image du démon local au lieu de construire
--from-tarstringpousse cette archive au lieu de construire
-f, --filestringCONTEXT/Dockerfilechemin du Dockerfile
--platformlisteplateformes cibles, ex. linux/amd64,linux/arm64
--build-argstring, répétablevariable de build KEY=VALUE
--targetstringétape de build visée
--no-pushboolfalsecharge l'image dans le démon local au lieu de la pousser (une seule --platform)
--no-scanboolfalsepas d'analyse de vulnérabilités
--registry-scanboolfalseattend l'analyse du registre au lieu de l'analyse locale par trivy
--severitystringHIGHsévérité minimale listée : UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL
--fail-onstringsort 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-timeoutdurée5mavec --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 :

MessageCause
--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 --platformplusieurs plateformes avec --no-push
--build-arg "…": expected KEY=VALUEargument 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.

FlagTypeDéfautDescription
(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).

FlagTypeDéfautDescription
--show-passwordboolfalseaffiche 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​