Des déploiements sûrs dépendent de la connaissance exacte de ce qui s'exécute. Ce guide montre comment étiqueter les images Docker pour la prévisibilité, s'authentifier aux registres de façon sécurisée, éviter les surprises du tag latest et garder les rollbacks à une commande près. Il inclut des commandes copier-coller, des exemples de Dockerfile, des astuces Docker Compose et des notes de dépannage pour la production.
À qui cela s'adresse
- Propriétaires de petites entreprises : réduisez le risque de déploiement sans outillage lourd en adoptant un workflow simple d'étiquetage et de promotion qui s'intègre aux pipelines CI/CD (Continuous Integration/Continuous Deployment : intégration continue/déploiement continu) existants.
- Opérateurs marketing : déployez des mises à jour de site ou de campagne en confiance, et revenez en arrière rapidement si un déploiement casse.
- Ingénieurs plateforme : imposez l'immutabilité et la traçabilité sur plusieurs services avec un minimum de scripts personnalisés.
Objectifs
- Déploiements déterministes : la même image partout.
- Rollbacks rapides : revenir en arrière en quelques secondes.
- Traçabilité claire : savoir quel commit et quelle version sont en production.
Aperçu du workflow
Le pattern le plus sûr est : construire une fois, étiqueter clairement, pousser de façon immuable, puis promouvoir. Par exemple, une équipe construisant une API Node.js peut construire l'image une fois dans la CI, l'étiqueter avec la version et le SHA Git, la pousser vers un registre privé, puis promouvoir la même image du staging vers la production en déplaçant un tag de canal. Voici le flux de bout en bout que vous pouvez scripter.
1. Choisir un schéma d'étiquetage
- Tags de version sémantique :
1.4.0, plus des rails majeur et mineur mobiles :1.4et1. Ils identifient les versions que les utilisateurs reconnaissent. - Tag SHA Git :
sha-<shortsha>pour une identité unique et immuable. - Tags de canal optionnels :
stagingetprodpeuvent être des pointeurs mobiles pour la promotion, tandis que la version et le SHA restent immuables. - Évitez de déployer depuis
latest. Gardezlatestseulement pour la commodité du développement local.
Utilisez des labels OCI (Open Container Initiative : initiative pour la standardisation des conteneurs) pour enregistrer la version, le commit et la source. Cela rend les audits et le dépannage directs.
2. Ajouter des labels pour la traçabilité
Extrait de Dockerfile exemple :
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
3. Construire une 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" )
# Construire 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.4et1sont des rails de commodité qui pointent toujours vers la plus récente version1.4.xet1.x. Gardez ces rails immuables par build de release. Ne réutilisez pas un tag pour une image différente après l'avoir poussé.- Ajoutez
latestseulement pour les tests locaux si nécessaire, et jamais pour les déploiements en production.
4. S'authentifier à votre registre
Utilisez un compte robot à portée limitée ou un jeton. Ne codez pas les mots de passe en dur dans les scripts.
REG=registry.example.com
USER=ci-bot
TOKEN=$(op read op://MyVault/ci-bot/token) # Exemple de récupération de secret via 1Password CLI
# Ou dans GitHub Actions : TOKEN=${{ secrets.REGISTRY_TOKEN }}
echo "$TOKEN" | docker login $REG -u "$USER" --password-stdin
Si un gestionnaire de secrets n'est pas disponible, utilisez des variables d'environnement et le store de secrets de votre CI. Faites tourner les jetons régulièrement.
5. Pousser les 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'immutabilité des tags dans votre registre si supporté. Sinon, imposez-la dans vos scripts : refusez de pousser si le tag existe déjà.
Exemple de script de garde pour prévenir les écrasements :
#!/usr/bin/env bash
set -euo pipefail
IMG="$1"
if docker manifest inspect "$IMG" >/dev/null 2>&1; then
echo "Refus d'écraser le tag existant : $IMG" >&2
exit 1
fi
Utilisez-le 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"
6. Promouvoir par retaggage vers des canaux (optionnel)
Les canaux comme staging et prod sont des pointeurs que vous déplacez pendant la promotion. Gardez les tags de version et SHA comme vérité de base.
# Retagger localement
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 le staging depuis
:staging, validez, puis déplacez:prodvers le même digest. - Rollback en remettant
:prodvers la version ou le digest précédent connu bon.
7. Déployer par digest ou tag immuable
- Préférez le déploiement par digest pour une immutabilité parfaite.
- Si votre plateforme attend des tags, utilisez le tag de version (
1.4.0), paslatest.
Obtenez le digest après le push :
DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $REG/$APP:$VER)
echo "$DIGEST" # ex: registry.example.com/myapp@sha256:abc...
8. Vérifier l'identité du déploiement
# Sur n'importe quel nœud avec accès à l'image
IMG=$REG/$APP:$VER
docker inspect $IMG --format='Name: {{.RepoTags}}
Digest: {{index .RepoDigests 0}}
Version: {{index .Config.Labels "org.opencontainers.image.version"}}
Commit: {{index .Config.Labels "org.opencontainers.image.revision"}}
Built: {{index .Config.Labels "org.opencontainers.image.created"}}'
Cela vous donne une info de version lisible et un digest cryptographique.
Tags sémantiques, tags SHA Git et immutabilité
- Tags sémantiques (
1.4.0) correspondent aux releases produit. Ils aident les humains à raisonner sur les changements. - Rails (
1.4,1) aident les consommateurs à rester sur une ligne mineure ou majeure. - Tags SHA Git (
sha-<shortsha>) sont uniques et mappent directement à un commit source. - Immutabilité signifie qu'un tag ne change jamais de contenu après le push. Imposé dans le registre ou dans vos scripts. L'immutabilité est essentielle pour les audits et la sécurité des rollbacks.
Les risques de latest
latestn'est qu'un nom. Il n'est pas spécial et n'est pas garanti par Docker.- Deux environnements tirant
latestà des moments différents obtiendront probablement des images différentes. - Ne déployez jamais la production depuis
latest. Si vous gardezlatestpour la commodité, ne le poussez pas vers les registres de production et n'autorisez pas la production à 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
Utilisation d'un digest pour un épinglage parfait :
services:
web:
image: registry.example.com/myapp@sha256:abc123...
ports:
- "8080:80"
Étiquetage favorable au rollback
Gardez ces références pour chaque build de release :
1.4.0(immuable)sha-<shortsha>(immuable)1.4et1(rails immuables par build)prod(canal mobile)
Options de rollback
- Le plus rapide : retagger
prodvers le précédent1.4.0et pousser. - Le plus robuste : déployer par digest et basculer vers le digest précédent.
Exemples
# Identifier la version précédente bonne
PREV=1.3.9
docker tag $REG/$APP:$PREV $REG/$APP:prod
docker push $REG/$APP:prod
Ou basé sur le digest :
PREV_DIGEST=registry.example.com/myapp@sha256:deadbeef...
# Mettre à jour votre déploiement pour référencer PREV_DIGEST et appliquer.
Checklist de traçabilité en production
- Labels : version, commit, date de build, URL source.
- Tags : version sémantique et SHA Git pour chaque build.
- Digests : enregistrer le digest déployé dans les notes de release ou le changelog.
- Étapes de reproduction : stocker les arguments de build exacts et la version du Dockerfile.
- Registre : immutabilité des tags activée ou imposée par script.
Plan pilote local
Commencez petit et prouvez la valeur vite.
Périmètre
- Choisissez un service (site statique, API ou worker).
Étapes
- Ajoutez les labels au Dockerfile.
- Construisez une fois avec les tags
1.0.0etsha-<shortsha>. - Poussez vers un namespace privé après
docker login. - Déployez une stack compose avec l'image épinglée à
1.0.0. - Confirmez labels et digest avec
docker inspect. - Simulez une nouvelle release
1.0.1, puis pratiquez le rollback vers1.0.0.
Ce qu'il faut mesurer
- Temps de rollback (cible sous 2 minutes).
- Cohérence : le digest en staging égale le digest en production après promotion.
- Zéro écrasement : aucun tag n'a été réutilisé pour un contenu différent.
Dépannage
Tag écrasé par accident
- Symptôme :
1.4.0pointe maintenant vers un digest différent. - Fix : supprimez le mauvais tag si permis, repoussez l'image correcte, et activez l'immutabilité des tags ou les scripts de garde.
Tirer latest donne des résultats incohérents
- Symptôme : staging et production se comportent différemment.
- Fix : arrêtez d'utiliser
latest. Épinglez à1.4.0ou à un digest.
Impossible de s'authentifier au registre
- Symptôme :
docker loginéchoue. - Fix : vérifiez le nom d'utilisateur, la portée du jeton et l'URL du registre. Utilisez
--password-stdinet évitez les caractères spéciaux nécessitant un échappement shell.
Le déploiement a utilisé la mauvaise image
- Symptôme : la version de l'app ne correspond pas à l'attendu.
- Fix :
docker inspectl'image du conteneur en cours. Comparez labels et digest à votre release visée. Mettez à jour le déploiement pour utiliser un tag épinglé ou un digest.
Incohérence de digest entre environnements
- Symptôme : même tag, digest différent entre clusters.
- Fix : imposez l'immutabilité et promouvez en déplaçant un tag de canal ou en déployant le digest exact.
Conclusion
Des releases Docker sûres sont simples avec quelques habitudes :
- Construisez une fois, étiquetez avec une version sémantique et un SHA Git.
- Gardez les tags de version et SHA immuables.
- Évitez
latesten production. - Utilisez les labels pour la traçabilité et vérifiez avec
docker inspect. - Promouvez par retaggage vers des canaux ou en déployant les digests.
- Répétez les rollbacks jusqu'à ce qu'ils soient rapides et routiniers.
Commencez avec un pilote sur un seul service, scriptez le flux, puis étendez à tous les services. Cela réduit le retravail, améliore la confiance et garde les changements de production prévisibles.