Intro
Cette version française explique Docker image tagging and registry workflows for safe releases avec le même objectif pratique que l article source : aider le lecteur à comprendre le contexte, les décisions à prendre et les points à vérifier avant de passer à l action.
Des releases sûres reposent sur la capacité à savoir exactement ce qui tourne. Ce guide explique comment mettre en place un Docker image tagging prévisible, authentifier un container registry en toute sécurité, éviter les surprises liées à latest, et garder le rollback à une commande de distance. Vous trouverez des docker commands prêtes à copier-coller, des Dockerfile examples, des astuces Docker Compose pour le local testing, et des notes de troubleshooting pour la production.
À qui cela profite
- Petites entreprises : réduire le risque de release sans outillage lourd.
- Opérateurs marketing : livrer des mises à jour de site ou de campagne en confiance, avec un retour arrière rapide si besoin.
Objectifs
- Déploiements déterministes : la même image partout.
- Rollbacks rapides : revenir en quelques secondes.
- Traçabilité claire : savoir quel commit et quelle version sont en ligne.
Vue d'ensemble du workflow
Le schéma le plus sûr est « build once, tag clairement, push immuable, puis promotion ». Voici le flux complet que vous pouvez scripter.
- Choisir un schéma de tags
- Tags sémantiques : 1.4.0, plus les rails 1.4 et 1. Ces tags identifient des releases que les utilisateurs reconnaissent.
- Git SHA tags : sha-<shortsha> pour une identité unique et immuable.
- Tags de canal optionnels : staging et prod comme pointeurs mobiles pour la promotion, tandis que la version et le SHA restent immuables.
- Évitez de déployer depuis latest. Gardez latest uniquement pour le dev local.
Utilisez des labels OCI pour enregistrer version, commit et source. Cela rend l'audit et le troubleshooting directs.
- Ajouter des labels pour la traçabilité
Exemple Dockerfile snippet:
FROM nginx:1.25-alpine
ARG VERSION
ARG VCS_REF
ARG BUILD_DATE
LABEL org.opencontainers.image.title="myapp" \
org.opencontainers.image.version="$VERSION" \
org.opencontainers.image.revision="$VCS_REF" \
org.opencontainers.image.created="$BUILD_DATE" \
org.opencontainers.image.source="https://example.com/repo"
COPY ./public /usr/share/nginx/html
- Builder une seule fois avec tous les tags
# Définir les variables
APP=myapp
REG=registry.example.com
VER=1.4.0
SHA=$(git rev-parse --short HEAD)
DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Builder l'image une seule fois
docker build \
--build-arg VERSION=$VER \
--build-arg VCS_REF=$SHA \
--build-arg BUILD_DATE=$DATE \
-t $REG/$APP:$VER \
-t $REG/$APP:1.4 \
-t $REG/$APP:1 \
-t $REG/$APP:sha-$SHA \
.
Notes
- 1.4 et 1 sont des rails qui pointent vers la plus récente 1.4.x et 1.x. Gardez ces rails immuables par build. Ne réutilisez pas un tag pour une image différente après push.
- Ajoutez latest uniquement pour le local testing si nécessaire, jamais pour la production.
Utilisez un compte robot à portée limitée ou un token. Ne mettez pas de mots de passe en dur dans vos scripts.
- Authentifier votre registry
REG=registry.example.com
USER=ci-bot
TOKEN=$(op read op://MyVault/ci-bot/token) # Exemple de récupération de secret
echo "$TOKEN" | docker login $REG -u "$USER" --password-stdin
Si aucun secret manager n'est disponible, utilisez des variables d'environnement et le store de secrets de votre CI. Faites tourner vos tokens régulièrement.
- Pousser des tags immuables
docker push $REG/$APP:$VER
docker push $REG/$APP:1.4
docker push $REG/$APP:1
docker push $REG/$APP:sha-$SHA
Bonnes pratiques
- Activez l'immuabilité des tags dans votre registry si pris en charge. Sinon, appliquez-la dans vos scripts : refusez de pousser si le tag existe déjà.
Script de garde pour éviter les overwrites :
#!/usr/bin/env bash
set -euo pipefail
IMG="$1"
if docker manifest inspect "$IMG" >/dev/null 2>&1; then
echo "Refus d'écraser un tag existant : $IMG" >&2
exit 1
fi
À utiliser avant chaque push :
check_immutable "$REG/$APP:$VER"
check_immutable "$REG/$APP:1.4"
check_immutable "$REG/$APP:1"
check_immutable "$REG/$APP:sha-$SHA"
Les canaux comme staging et prod sont des pointeurs que vous déplacez lors de la promotion. Les tags de version et de SHA restent la source de vérité.
- Promouvoir via retag vers des canaux (optionnel)
# Retag en local
docker tag $REG/$APP:$VER $REG/$APP:staging
docker push $REG/$APP:staging
# Plus tard, après validation
docker tag $REG/$APP:$VER $REG/$APP:prod
docker push $REG/$APP:prod
Pattern de promotion
- Déployez staging depuis :staging, validez, puis déplacez :prod vers le même digest.
- Rollback en déplaçant :prod vers la version ou le digest connu bon.
- Déployer par digest ou tag immuable
- Préférez le déploiement par digest pour une immutabilité parfaite.
- Si votre plateforme exige un tag, utilisez le tag de version (1.4.0), pas latest.
Obtenir le digest après push :
DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $REG/$APP:$VER)
echo "$DIGEST" # ex. registry.example.com/myapp@sha256: abc...
- Vérifier l'identité du déploiement
# Sur tout nœud ayant accès à l'image
IMG=$REG/$APP:$VER
docker inspect $IMG --format='Name: {{.RepoTags}}\nDigest: {{index .RepoDigests 0}}\nVersion: {{index .Config.Labels "org.opencontainers.image.version"}}\nCommit: {{index .Config.Labels "org.opencontainers.image.revision"}}\nBuilt: {{index .Config.Labels "org.opencontainers.image.created"}}'
Vous obtenez des informations lisibles et un digest cryptographique.
Tags sémantiques, Git SHA tags, et immutabilité
- Les tags sémantiques (1.4.0) correspondent aux releases. Ils aident les humains à raisonner sur les changements.
- Les rails (1.4, 1) permettent de rester sur une ligne mineure/majeure.
- Les Git SHA tags (sha-<shortsha>) sont uniques et liés à un commit source.
- L'immutabilité signifie qu'un tag ne change jamais de contenu après push. Appliquez-la côté registry ou via scripts. Indispensable pour l'audit et la sécurité des rollbacks.
Les risques de latest
- latest n'est pas spécial : Docker ne garantit rien à son sujet.
- Deux environnements qui pullent latest à des moments distincts obtiendront probablement des images différentes.
- Ne déployez jamais la production depuis latest. Si vous gardez latest pour convenance, ne le poussez pas dans les registries de production et empêchez prod de le référencer.
Exemples Docker Compose
Compose local pour tests type staging, avec tags épinglés :
services:
web:
image: registry.example.com/myapp:1.4.0
pull_policy: always
ports:
- "8080:80"
environment:
- APP_ENV=staging
Utiliser un digest pour un pinning parfait :
services:
web:
image: registry.example.com/myapp@sha256: abc123...
ports:
- "8080:80"
Tagging favorable aux rollbacks
Conservez ces références pour chaque build de release :
- 1.4.0 (immuable)
- sha-<shortsha> (immuable)
- 1.4 et 1 (rails immuables par build)
- prod (canal mobile)
Options de rollback
- La plus rapide : retaguer prod vers la précédente 1.4.0 et pousser.
- La plus robuste : déployer par digest et basculer vers le digest précédent.
Exemples :
# Identifier la version précédente stable
PREV=1.3.9
docker tag $REG/$APP:$PREV $REG/$APP:prod
docker push $REG/$APP:prod
Ou basé sur digest :
PREV_DIGEST=registry.example.com/myapp@sha256: deadbeef...
# Mettez à jour votre déploiement pour référencer PREV_DIGEST et appliquez.
Checklist de traçabilité en production
- Labels : version, commit, date de build et URL source.
- Tags : version sémantique et Git SHA pour chaque build.
- Digests : consignez le digest déployé dans vos notes de changement.
- Étapes de repro : stockez les build args exacts et la version du Dockerfile.
- Registry : immutabilité des tags activée ou appliquée par script.
Plan pilote local
Commencez petit et démontrez vite la valeur.
Périmètre
- Choisissez un service (site statique, API ou worker).
Étapes
- Ajoutez des labels dans le Dockerfile.
- Build once avec 1.0.0 et sha-<shortsha>.
- Poussez vers un namespace privé après docker login.
- Déployez une stack Compose avec l'image épinglée sur 1.0.0.
- Vérifiez labels et digest via docker inspect.
- Simulez 1.0.1, puis entraînez le rollback vers 1.0.0.
Mesures
- Temps de rollback (objectif < 2 minutes).
- Cohérence : digest identique entre staging et prod après promotion.
- Zéro overwrite : aucun tag réutilisé.
Dépannage
Tag écrasé par accident
- Symptôme : 1.4.0 pointe maintenant vers un autre digest.
- Correction : supprimez le mauvais tag si permis, repoussez l'image correcte, et activez l'immuabilité ou les scripts de garde.
Pull de latest incohérent
- Symptôme : comportements différents entre staging et production.
- Correction : cesser d'utiliser latest. Épinglez 1.4.0 ou un digest.
Échec d'authentification au registry
- Symptôme : docker login échoue.
- Correction : vérifiez identifiant, portée du token et URL du registry. Utilisez --password-stdin et évitez les caractères spéciaux non échappés.
Mauvaise image déployée
- Symptôme : la version ne correspond pas à l'attendu.
- Correction : docker inspect sur l'image en cours. Comparez labels et digest à la release visée. Mettez à jour pour utiliser un tag/digest épinglé.
Digest différent entre environnements
- Symptôme : même tag, digest différent.
- Correction : imposez l'immuabilité et promouvez via un tag de canal ou le digest exact.
Conclusion
Les Docker releases sûres reposent sur quelques habitudes :
- Build once et taguer avec une version sémantique + Git SHA.
- Garder les tags de version et de SHA immuables.
- Éviter latest en production.
- Utiliser des labels pour la traçabilité et vérifier avec docker inspect.
- Promouvoir via retag de canaux ou déploiement par digest.
- Répéter les rollbacks jusqu'à ce qu'ils soient rapides et sans surprise.
Commencez par un pilote mono-service, script ez le flux, puis déployez la pratique à tous vos services pour réduire la rework, renforcer la confiance et garder vos changements en production prévisibles.