2.3 · Versionner et publier ses images

Niveau 2 · Dockerfile & build

2.3Versionner et publier ses images

Objectif : Taguer proprement ses images et les publier sur un registre pour les partager.
Temps estimé : 11 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • Taguer au build, compte inclus : compte/image:version est l'adresse complète — sans namespace, pas de push.
  • Immuable par livraison : un tag figé et testé par version (1.2.0), jamais réécrit — les alias mouvants ne servent qu'au confort.
  • Jamais de secret poussé : tout ce qui entre dans l'image part au push — un push public est irréversible.

Mini-cas filé — Idir et la prod qui tirait latest

L'image maigre d'Idir (2.2) tourne en local, mais l'équipe la partage à la main, en latest, sans version : la prod a déjà dérivé deux fois. Idir tague au build avec le compte (moncompte/mon-app:1.2.0 plus alias 1.2), se connecte au registre, pousse les deux tags, puis fait tirer la 1.2.0 sur une autre machine : build ici, run ailleurs, version figée. Il vérifie la visibilité du dépôt avant de pousser. En 2.4, il rendra cette image configurable ; en 2.5, il vérifiera qu'elle ne contient aucun secret avant tout nouveau push.

Suite du fil rouge 2.2 : l'image maigre d'Idir voyage avec un numéro de version — et continue en 2.4 et 2.5.

1. Taguer comme un pro

On tague au build (-t moncompte/mon-app:1.2.0) et on ajoute des alias utiles (1.2, latest en dev). Règle : un tag immuable par livraison (1.2.0), jamais réécrit ; les alias mouvants ne servent qu'au confort. La prod tire toujours le tag figé et testé, jamais latest. Idir fige la 1.2.0 et laisse la 1.2 suivre les correctifs.

2. Publier : login, push, pull

docker login authentifie, docker push moncompte/mon-app:1.2.0 publie, n'importe quelle machine la récupère par pull. Le nom compte/image:tag est l'adresse complète : sans compte (namespace), le push est refusé. Idir pousse ses deux tags puis, sur une autre machine (ou après un rmi local), tire la 1.2.0 et la lance : la preuve que l'image voyage.

3. Public ou privé ?

Par défaut sur le Hub, un dépôt est public : parfait pour l'open source, interdit pour le code interne. Pour l'interne, dépôt privé (Hub payant, GHCR, registre d'entreprise). Et jamais de secret dans l'image : un secret COPY ou ENV reste dans les couches et part au push — un push public est irréversible. Idir contrôle la visibilité avant chaque push et garde les secrets hors image (2.5).

Erreur d'interprétation fréquente : « Tout en latest, c'est plus simple ». Non : latest bouge à chaque push, la prod dérive sans prévenir et on ne sait plus ce qui tourne. La règle d'Idir : un tag immuable (1.2.0) par livraison pour la prod, des alias mouvants (1.2, latest) pour le confort en dev — jamais l'inverse.
De l'image locale au registre Taguer au build, authentifier, pousser build -t compte/app:1.2 Taguerau build, compte inclusdocker login S'authentifierau registredocker push Publier,puis pull ailleurs
Taguer au build, authentifier, pousser
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Idir TAGUE : au build, avec le namespace (moncompte/mon-app:1.2.0) plus un alias de confort (1.2) — la 1.2.0 est figée, jamais réécrite. 2) Il POUSSE : docker login puis docker push des deux tags, visibilité du dépôt vérifiée (public pour l'open source, privé pour l'interne). 3) Il TIRE : sur une autre machine, docker pull de la 1.2.0 puis run — build ici, run ailleurs. Leçon : la prod tire un tag figé et testé, jamais latest.

🔎 Exemple concret — 🔎 Exemple concret — Publier la 1.2.0

L'image d'Idir, de la machine locale au registre :

docker build -t moncompte/mon-app:1.2.0 -t moncompte/mon-app:1.2 .
docker login
docker push moncompte/mon-app:1.2.0
docker push moncompte/mon-app:1.2
# sur une autre machine :
docker pull moncompte/mon-app:1.2.0

Lecture : la 1.2.0 est figée et testée, la 1.2 suit les correctifs, latest reste un confort de dev.

Leçon : la prod tire la 1.2.0, jamais latest — reproductible et traçable.

Vocabulaire de la section

Namespace
Le compte ou l'organisation devant l'image (moncompte/mon-app) : l'adresse complète exigée pour pousser.

Exemple simple : Idir préfixe par son compte dès le build.

Ce que ce n'est pas : le tag de version seul.

Réflexe : pas de namespace = pas de push.

Tag immuable
Une version figée et jamais réécrite (1.2.0) : ce que la prod tire pour rester reproductible.

Exemple simple : Idir fige la 1.2.0 testée pour la prod.

Ce que ce n'est pas : un alias mouvant comme latest.

Réflexe : une livraison = un tag figé.

Alias
Un tag mouvant de confort (1.2, latest) qui suit les correctifs ; pratique en dev, interdit comme référence de prod.

Exemple simple : Idir laisse 1.2 suivre les patchs, latest pour les essais.

Ce que ce n'est pas : la référence déployée en production.

Réflexe : confort en dev, jamais en prod.

push / pull
Publier vers le registre (push) et récupérer depuis le registre (pull) : le trio du partage avec login.

Exemple simple : Idir pousse la 1.2.0 et la tire sur une autre machine.

Ce que ce n'est pas : un build local jamais partagé.

Réflexe : login, push, pull : partager versionné.

En pratique — En pratique — Publier votre app

  1. Rebuildez votre app avec deux tags (1.0.0 figé et 1.0 alias).
  2. Connectez-vous au registre (docker login).
  3. Poussez les deux tags (docker push), visibilité vérifiée.
  4. Sur une autre machine (ou après rmi), tirez la 1.0.0 et lancez-la.
Vos images voyagent : build ici, run ailleurs, version figée.

Script prêt à dire — imposer le tag figé (30 s)

« On ne déploie plus latest : chaque livraison a son tag figé, testé, jamais réécrit — la 1.2.0 tourne en prod, on sait exactement quoi. Les alias comme 1.2 ou latest restent pour le confort en dev. Build ici, pull ailleurs, même version partout. »

À dire en montrant le pull de la 1.2.0 d'Idir sur une seconde machine.

Modèle copier-coller — taguer et publier

docker build -t moncompte/mon-app:1.2.0 -t moncompte/mon-app:1.2 .
docker login
docker push moncompte/mon-app:1.2.0
docker push moncompte/mon-app:1.2
docker pull moncompte/mon-app:1.2.0

Push refusé

Push « denied » : Idir vérifie le login, le namespace compte/image et ses droits sur le dépôt.

Interne en public

Code interne poussé en dépôt public : Idir repasse en privé (ou registre d'entreprise) avant le push.

Tag réécrit

Une 1.2.0 repoussée différemment après déploiement : Idir fige 1.2.1 au lieu de réécrire l'histoire.

Push à chaque commit

Chaque essai poussé pollue le registre : Idir ne pousse que les versions testées, la CI triera (niveau 4).

✓ Bonnes pratiques

  • Un tag immuable par livraison, jamais réécrit.
  • Préfixer par le compte dès le build.
  • Vérifier la visibilité (public/privé) avant le push.

✗ Pièges fréquents

  • Réécrire un tag déjà déployé (dérive de prod).
  • Pousser en public du code interne.
  • Inclure des secrets dans l'image poussée.

Points clés à retenir

  • On tague au build, compte inclus (adresse complète).
  • Immuable par livraison (1.2.0), alias (1.2, latest) pour le confort.
  • login → push → pull : le trio du partage versionné.
  • Jamais de secret dans une image poussée (push public irréversible).

Défi 48h — appliquez demain

Publiez votre image maigre (2.2) : build à deux tags (1.0.0 + 1.0), login + push visibilité vérifiée, puis pull + run de la 1.0.0 ailleurs.

Checklist sortie de section
  • Je peux taguer au build (immuable + alias, compte inclus).
  • Je sais publier (login, push) et récupérer (pull) ailleurs.
  • Je contrôle public/privé et j'exclus les secrets avant tout push.
Auto-évaluation 1-5 : est-ce que ma prod tire un tag figé ?est-ce que je vérifie la visibilité avant chaque push ?

Questions fréquentes

Pourquoi mon push est refusé (denied) ?

Souvent un nom sans namespace, ou pas de login, ou pas de droits sur le dépôt. Vérifiez docker login, le nom compte/image:tag et vos droits d'écriture sur le dépôt avant de recommencer.

Faut-il pousser à chaque commit ?

Non : on pousse les versions testées (tags figés), pas chaque essai. La CI (niveau 4) automatisera ce tri : elle build à chaque commit mais ne publie que les versions validées.

Vérifiez votre compréhension

Quelle politique de tags pour la production ?

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

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