4.1 · Registres : Hub, GHCR et registre privé

Niveau 4 · Registres, fiabilité & CI

4.1Registres : Hub, GHCR et registre privé

Objectif : Publier et tirer des images depuis le bon registre, public ou privé.
Temps estimé : 12 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • Trois registres, trois usages : Docker Hub pour partager en public, GHCR lié au code pour la CI, registre privé (interne à l'entreprise) pour le sensible — le nom complet (registre/compte/image:tag) dit toujours d'où vient l'image.
  • On s'authentifie avec un token à droits limités, jamais avec le mot de passe du compte : passé par --password-stdin, il ne traîne ni dans l'historique shell ni dans les logs CI — et se révoque en un clic en cas de doute.
  • Réflexe d'Idir : en production, on tire un nom complet + tag immuable (jamais un raccourci ambigu), noté dans le compose de prod pour savoir quelle image tourne où.

Mini-cas filé — Idir publie l'image de sa startup sans fuiter le token

Idir, devops junior à Alger, doit publier l'image de l'application de sa startup pour que l'équipe la déploie : il choisit GHCR (le code est déjà sur GitHub), crée un token limité au push/pull, se connecte via --password-stdin et pousse un tag de version immuable. En production, l'équipe tire le nom complet et sait exactement quelle image tourne. Premier jalon du fil rouge : l'image est au bon endroit, accessible aux bonnes personnes, sans secret exposé.

Ce même cas revient dans le cours, le schéma, le script et le défi 48h — et continue en 4.2, 4.3, 4.4 et 4.5.

1. Trois registres, trois usages

Docker Hub : la bibliothèque publique par défaut, pour partager (open source, images de base). GHCR (GitHub Container Registry) : le registre lié à votre code, parfait pour la CI — chaque dépôt y a ses paquets. Registre privé (interne à l'entreprise) : le coffre des images sensibles, à accès restreint. Le nom complet l'indique : registre/compte/image:tag — Idir lit d'un coup d'œil d'où vient chaque image.

Choisir, c'est trancher selon la sensibilité et l'usage : public pour l'open source, GHCR pour vos CI GitHub, privé pour l'interne sensible. Le compose de production fige le choix en notant les noms complets.

2. S'authentifier sans exposer

docker login avec un token à droits limités (push/pull), jamais le mot de passe du compte. Le token passe par --password-stdin (tube, pas d'argument visible) : rien dans l'historique shell, rien dans les logs. En CI, le token vit dans les secrets du dépôt, jamais dans le script ni dans le fichier de workflow.

Un token qui fuit se révoque en un clic : c'est pour cela qu'on ne partage jamais de compte — un compte partagé compromis, c'est tout l'accès à refaire. Comme Idir, on crée un token par usage et on révoque au moindre doute.

3. Tirer en production : figez la source

En production, on tire nom complet + tag immuable (une version figée), jamais un raccourci ambigu qui peut changer de contenu entre deux déploiements. La traçabilité « quelle image tourne où » commence par des noms complets notés dans le compose de prod.

Vérifier après le tirage : l'image démarrée correspond bien au tag voulu. Un tag mouvant en prod, c'est un déploiement qu'on ne peut ni reproduire ni auditer.

Erreur d'interprétation fréquente : « Pour aller vite, je mets mon mot de passe en clair avec -p et je pousse en latest : c'est pareil ». Non. Le mot de passe en clair traîne dans l'historique et les logs, et il donne un accès total non révocable proprement ; un tag mouvant en production rend le déploiement irreproductible. Token limité via --password-stdin, stocké en secret CI, tag immuable en prod : c'est ce trio qui fait une publication propre.
Publier sans exposer Bon registre, token propre, tag figé Choisir le registre Hub public,GHCR CI, privé interneToken limité Droitspush/pull, révocableLogin propre --password-stdin,secret CITag immuable Nomcomplet figé en prod
Bon registre, token propre, tag figé
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Idir choisit le registre selon l'usage : GHCR pour l'image liée au code de sa startup. 2) Il crée un token à droits limités (push/pull) au lieu d'utiliser le mot de passe du compte. 3) Il se connecte via --password-stdin pour que le secret ne traîne ni dans l'historique ni dans les logs. 4) Il pousse un tag de version immuable et la production tire le nom complet. Leçon : bon registre, token limité par stdin, tag figé — et révocation au moindre doute.

🔎 Exemple concret — 🔎 Exemple concret — Pousser vers GHCR

Le geste d'Idir : login sans trace, image traçable.

echo $GHCR_TOKEN | docker login ghcr.io -u moncompte --password-stdin
docker build -t ghcr.io/monequipe/app:1.2.0 .
docker push ghcr.io/monequipe/app:1.2.0
# en prod :
docker pull ghcr.io/monequipe/app:1.2.0

Lecture : le token ne s'affiche jamais, l'image est traçable par son nom complet.

Leçon : --password-stdin évite le secret dans l'historique.

Vocabulaire de la section

GHCR
Le registre de GitHub, lié aux dépôts et à la CI : chaque projet y publie ses images.

Exemple simple : Idir y pousse l'image de l'application dont le code est déjà sur GitHub.

Ce que ce n'est pas : un simple dossier de stockage de fichiers.

Réflexe : code sur GitHub + image à publier en CI : penser GHCR.

Token
Jeton d'accès à droits LIMITÉS et révocable, qui remplace le mot de passe pour les usages automatisés.

Exemple simple : Idir crée un token push/pull au lieu de coller son mot de passe dans un script.

Ce que ce n'est pas : le mot de passe du compte, total et difficile à révoquer proprement.

Réflexe : automatiser un accès : créer un token limité, jamais le mot de passe.

Nom complet
Adresse sans ambiguïté d'une image : registre/compte/image:tag.

Exemple simple : L'équipe d'Idir déploie un nom complet avec version figée en production.

Ce que ce n'est pas : un raccourci ambigu qui peut changer de contenu.

Réflexe : production : toujours tirer un nom complet + tag immuable.

--password-stdin
Option de docker login qui lit le secret depuis un tube au lieu d'un argument visible.

Exemple simple : Idir pipe son token : rien ne reste dans l'historique shell.

Ce que ce n'est pas : l'option -p qui expose le secret en clair.

Réflexe : se connecter à un registre : toujours via stdin.

En pratique — En pratique — Publier au bon endroit

  1. Choisissez le registre adapté à votre cas (Hub/GHCR/privé).
  2. Créez un token à droits limités (push/pull).
  3. Connectez-vous via --password-stdin.
  4. Poussez un tag immuable et tirez-le ailleurs pour vérifier.
Vos images sont au bon endroit, accessibles aux bonnes personnes.

Script prêt à dire — expliquer le choix du registre à son responsable (30 s)

« C'est Idir : j'ai publié notre image sur GHCR avec un token limité au push et au pull, connecté sans laisser de trace. La production tire le nom complet avec la version figée, donc on sait exactement quelle image tourne. Si le token fuit, je le révoque en un clic. »

À dire quand on vous demande pourquoi ne pas « juste pousser en public » : montrez la sensibilité du code.

Modèle copier-coller — publier une version (GHCR)

echo $GHCR_TOKEN | docker login ghcr.io -u moncompte --password-stdin
docker build -t ghcr.io/monequipe/app:1.2.0 .
docker push ghcr.io/monequipe/app:1.2.0
docker pull ghcr.io/monequipe/app:1.2.0

Image open source

Comme Idir mais vers Docker Hub en public : la communauté peut tirer librement, version figée pour la confiance.

Image interne sensible

Registre privé de l'entreprise, dépôt à accès restreint : seules les équipes habilitées tirent.

Token qui a fuité

Révoquer immédiatement le token, en créer un nouveau limité, vérifier les accès — sans toucher au compte.

Prod qui doit être auditable

Nom complet + tag immuable notés dans le compose de prod : on sait quelle image tourne où, à tout moment.

Prudence : Les tokens de registre sont des secrets : stockez-les dans les secrets CI (ou un gestionnaire de secrets), jamais en dur dans un script, un fichier compose ou un workflow — et passez-les toujours via --password-stdin. Un pipeline ou un historique qui affiche un secret en clair est à corriger d'urgence, puis révoquez le token exposé.

✓ Bonnes pratiques

  • Tokens limités, jamais de mots de passe.
  • Noms complets en production.
  • Révoquer au moindre doute.

✗ Pièges fréquents

  • Login avec -p et le secret visible (historique).
  • Images internes poussées en public.
  • Tags raccourcis ambigus en production.

Points clés à retenir

  • Hub = public, GHCR = CI, privé = interne.
  • Tokens limités via --password-stdin.
  • Nom complet + tag immuable en production.
  • On révoque sans hésiter.

Défi 48h — appliquez demain

Publiez une vraie image : créez un token limité, connectez-vous via --password-stdin, poussez un tag de version puis tirez-le depuis une autre machine.

Checklist sortie de section
  • Je sais choisir le registre adapté (Hub, GHCR, privé).
  • Je sais m'authentifier par token limité via --password-stdin.
  • Je sais pousser et tirer un tag immuable traçable.
Auto-évaluation 1-5 : mon dernier login a-t-il exposé un secret quelque part ?saurais-je dire quelle image exacte tourne en production ?

Questions fréquentes

Pourquoi --password-stdin plutôt que -p ?

Parce que -p expose le secret dans l'historique shell et les logs CI. Le pipe ne laisse aucune trace : le token transite sans jamais apparaître en clair.

Garder le même registre partout ?

Non : public pour l'open source, GHCR pour vos CI GitHub, privé pour l'interne sensible. Le compose de production fige le choix avec des noms complets.

Vérifiez votre compréhension

En CI, comment s'authentifier au registre ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 4Questions inédites et durcies pour valider vos acquis