Pousser et tirer des images
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 sur les tenants.
Ce guide configure docker pour qu'il s'authentifie avec votre session sng, puis montre
comment pousser, tirer et supprimer des images. Il se termine par l'utilisation de l'image
dans une App.
Prérequis
- Une session de tenant :
sng sso login, puissng tenant use acme. - Un dépôt : déclaré par
sng registry create web(Dépôts et rétention), ou créé automatiquement parsng registry build. - Le droit
registry:pushsur le dépôt (policyreadwrite) pour pousser,registry:pull(policyreadonly) pour tirer. - Docker installé, pour les étapes qui l'utilisent.
1. Brancher docker sur votre session
sng registry login
docker now authenticates to ovh-gra-0.registry.dev.stackngo.fr with the session of tenant "acme"
La commande vérifie votre session auprès du registre, puis ajoute dans
~/.docker/config.json (ou $DOCKER_CONFIG/config.json) l'entrée
"credHelpers": {"ovh-gra-0.registry.dev.stackngo.fr": "sng"}. Docker appelle alors
docker-credential-sng, un lien vers sng, qui lui transmet la session courante et la
renouvelle si besoin. Aucun mot de passe n'est stocké.
Si la commande avertit docker-credential-sng is not in PATH, ajoutez le dossier indiqué à
votre PATH, sinon docker ne trouvera pas l'assistant.
2. Pousser une image
Avec docker :
docker build -t ovh-gra-0.registry.dev.stackngo.fr/acme/web:1.0.0 .
docker push ovh-gra-0.registry.dev.stackngo.fr/acme/web:1.0.0
Ou avec sng, qui préfixe lui-même le registre et le tenant, pour une image déjà construite :
docker build -t web:1.0.0 .
sng registry build --from-image web:1.0.0
pushed ovh-gra-0.registry.dev.stackngo.fr/acme/web:1.0.0@sha256:4f1c9a…
--from-image IMAGE prend une image du démon docker local, sans reconstruire. Sans -t, il
reprend le dernier composant du nom et le tag : ghcr.io/acme/tool:3 devient tool:3.
Sans démon docker, poussez une archive (docker save ou archive OCI) :
sng registry build --from-tar web.tar -t web:1.0.0
3. Construire et pousser en une commande
sng registry build . -t web:1.0.0
pushed ovh-gra-0.registry.dev.stackngo.fr/acme/web:1.0.0@sha256:4f1c9a…
sng registry build lance docker buildx build --push avec votre session. Il accepte
-f, --platform, --build-arg et --target comme docker buildx. Sans -t, le dépôt
porte le nom du dossier courant, tag latest.
Le dépôt n'a pas besoin d'exister : s'il n'est pas déclaré, sng registry build le déclare
pour vous (privé, tous les tags gardés) et attend qu'il soit prêt avant de pousser. Pour régler
la rétention ou la visibilité, déclarez-le d'abord avec sng registry create
(Dépôts et rétention).
Une fois l'image poussée, sng registry build l'analyse sur votre poste avec trivy et
affiche les vulnérabilités de sévérité HIGH ou plus (--severity pour changer le seuil).
Sans trivy installé, un avertissement s'affiche et la commande réussit quand même.
--fail-on CRITICAL fait échouer la commande si une vulnérabilité critique est trouvée (ou si
l'analyse n'a pas pu avoir lieu) ; --no-scan saute l'analyse. Voir
sng registry build.
4. Tirer une image
docker pull ovh-gra-0.registry.dev.stackngo.fr/acme/web:1.0.0
ou
sng registry pull web:1.0.0
sng registry pull web@sha256:4f1c9a… --output web.tar # archive au lieu du démon
pulled ovh-gra-0.registry.dev.stackngo.fr/acme/web:1.0.0@sha256:4f1c9a…
Sans tag ni digest, sng registry prend latest.
5. Utiliser l'image dans une App
La plateforme tire l'image avec une clé d'accès au registre du tenant : votre session
personnelle n'est pas transmise à vos applications. Déclarez une clé d'accès en lecture, puis
citez son identifiant dans l'App.
apiVersion: registry.stackngo.io/v1alpha1
kind: RegistryAccessKey
metadata:
name: puller
spec:
repositories: [web] # seulement le dépôt web
actions: [pull]
apiVersion: deploy.stackngo.io/v1alpha1
kind: App
metadata:
name: web
spec:
imagePullSecrets: [puller-registry] # identifiant préparé pour la clé "puller"
services:
web:
image: ovh-gra-0.registry.dev.stackngo.fr/acme/web:1.0.0
ports: ["8080"]
ingress: { port: 8080 }
sng apply infra/RegistryAccessKey/puller.yml
sng apply infra/App/web.yml
L'identifiant puller-registry est prêt quelques instants après la clé.
S'il ne l'est pas encore, le service reste en attente (ImagePullSecretNotFound) et démarre
dès qu'il apparaît. Un dépôt public: true n'a pas besoin de clé d'accès. Voir
Clés d'accès au registre.
Supprimer une image
sng registry delete web:1.0.0
⚠ Suppression de l'image ovh-gra-0.registry.dev.stackngo.fr/acme/web:1.0.0 (tous les tags du même digest)
Tapez « oui » pour confirmer : oui
deleted ovh-gra-0.registry.dev.stackngo.fr/acme/web@sha256:4f1c9a…
Le tag est résolu en digest et c'est l'image qui est supprimée : tous les tags qui
pointent vers le même digest disparaissent avec elle. Il faut registry:delete (policy
readwrite). --yes saute la confirmation, et est obligatoire hors terminal interactif (CI).
sng registry delete web, sans tag ni digest, supprime la déclaration du dépôt : voir
Dépôts et rétention.
Vérification
sng registry pull web:1.0.0 --output /tmp/web.tar
Le digest affiché doit être celui de la poussée.
Pour aller plus loin
- Autre tenant :
--tenant NAMEvise un autre tenant sur lequel vous pouvez ouvrir une session (pull,build,deleted'une image,login). Les droits sont alors ceux de vos policies dans ce tenant. - Configuration de sng : l'hôte est celui du cluster choisi par
sng config use-cluster(registry_urldans la configuration desng, par exempleovh-gra-0.registry.dev.stackngo.fr), ou de la variableSTNG_REGISTRY_URL.credHelperscontient une entrée par hôte : relancezsng registry loginaprès avoir changé de cluster. Une image du registre d'un autre cluster est refusée à l'application de l'App(image … is hosted on the registry of cluster …) : poussez-la sur le registre du cluster de l'App. Docker lance l'assistant sans les flags desng: si vous utilisez--config, exportezSTNG_CONFIG=<fichier>pour que l'assistant lise le même fichier. - Droits révoqués : un droit retiré prend effet au plus 5 minutes après la modification de la policy.
- Dépôt public :
docker pull ovh-gra-0.registry.dev.stackngo.fr/acme/docs:latestfonctionne sans aucune authentification. - Clients OCI :
crane,oras,skopeooubuildahutilisent la configuration docker écrite parsng registry login, donc votre session.
Erreurs fréquentes
| Symptôme | Cause | Correction |
|---|---|---|
registry refused the access (401) ou (403) | Dépôt non déclaré (ou pas encore appliqué), droit manquant, ou session expirée | sng registry create NAME, vérifier les policies (sng tenant policy list), sng tenant use NAME |
invalid repository "acme/web": one lowercase component … | Le nom contient un / ou des majuscules ; le tenant est ajouté par sng | Donner seulement web:1.0.0 |
docker push : error getting credentials … not authenticated | L'assistant docker lit la configuration par défaut de sng, pas celle de --config | export STNG_CONFIG=<fichier>, ou sng sso login |
registry authorization unavailable, retry later | Les droits ne peuvent pas être vérifiés pour l'instant ; aucun accès n'est accordé dans ce cas | Réessayer quelques instants plus tard |
-t needs a tag, not a digest | sng registry build -t web@sha256:… | Donner un tag |
--from-tar needs -t REPO[:TAG] | --from-tar sans cible | Ajouter -t REPO[:TAG] |
confirmation requise : relancez avec --yes … | delete lancé hors terminal | Ajouter --yes |
Service d'App en Waiting, RegistryAccessPending | L'accès en lecture du tenant au registre n'est pas encore prêt (tenant tout juste créé) | Attendre : le service démarre de lui-même ; signaler si cela dure plus de quelques minutes |
Service d'App en Waiting, ImagePullSecretNotFound | L'App déclare un imagePullSecrets qui n'existe pas (encore) | Corriger le nom, ou retirer imagePullSecrets pour revenir à l'accès par défaut |