Container Registry : Le Stockage de votre Logiciel
Le Registre de conteneurs est un système de stockage et de distribution intégré à GitLab qui permet de conserver vos images Docker. Contrairement au code source qui est du texte brut, une image Docker est une unité logicielle "prête à l'emploi" qui regroupe votre code, ses bibliothèques et ses dépendances pour garantir une exécution fiable sur n'importe quel serveur.
Pourquoi utiliser le Registre intégré de GitLab ?
Dans un cycle DevOps moderne, l'utilisation de conteneurs est la norme absolue. Utiliser le registre de GitLab plutôt qu'un service externe offre trois avantages majeurs :
- Sécurité Native : Vous n'avez pas besoin de créer des comptes supplémentaires. Les droits d'accès au registre sont strictement calqués sur les permissions de votre projet GitLab.
- Traçabilité Totale : Chaque image est liée au commit exact qui l'a générée. Vous savez précisément quelle version du code tourne sur votre serveur.
- Automatisation Transparente : GitLab fournit des identifiants temporaires sécurisés à vos pipelines pour qu'ils puissent pousser les images sans intervention humaine.
Construire et Pousser (Le Pipeline Build)
Le but est de transformer votre code en image Docker et de l'envoyer dans le coffre-fort de GitLab. Pour cela, on utilise des variables d'environnement prédéfinies que GitLab injecte automatiquement dans vos pipelines.
Exemple de pipeline (.gitlab-ci.yml) :
build_app:
stage: build
image: docker:latest
services:
- docker:dind # Docker-in-Docker pour permettre la construction
script:
# 1. Connexion au registre GitLab avec des identifiants temporaires
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
# 2. Construction de l'image avec un nom dynamique (Tag)
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG .
# 3. Envoi de l'image vers le registre GitLab
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
Détail des variables utilisées :
- $CI_REGISTRY_IMAGE : L'URL unique de stockage de votre projet.
- $CI_COMMIT_REF_SLUG : Le nom de votre branche, ce qui permet de versionner vos images.
- $CI_REGISTRY_USER / PASSWORD : Identifiants créés dynamiquement pour ce job précis.
Récupérer et Déployer (Le Pipeline Deploy)
Une fois l'image stockée dans le registre, elle est "gelée". Pour la déployer sur votre serveur ou votre cluster Kubernetes, vous devez effectuer un Pull de l'image.
Via Docker (Serveur simple)
Si vous déployez sur un serveur classique, vous devez d'abord vous connecter pour que Docker ait le droit de lire le registre privé de GitLab :
docker login registry.gitlab.com -u mon_user -p mon_access_token
docker pull registry.gitlab.com/mon-groupe/mon-projet:main
Via Kubernetes (Avec l'Agent GitLab)
C'est ici que tout se rejoint. Votre agent Kubernetes utilise son tunnel sécurisé pour récupérer l'image directement sans que vous n'ayez à gérer de mots de passe sur le serveur.
# Extrait d'un fichier de déploiement Kubernetes
spec:
containers:
- name: mon-app
image: registry.gitlab.com/mon-groupe/mon-projet:main # On pointe vers le registre
4. Gérer le cycle de vie des images
Le stockage occupe de l'espace disque. GitLab permet de gérer le nettoyage automatique des images via l'interface :
- Naviguez vers Settings > Container Registry.
- Utilisez les Cleanup Policies pour automatiser la suppression des anciens tags.
- Enable cleanup policy : Active la suppression automatique des tags d'images.
- Keep the most recent : Nombre de tags à conserver impérativement pour garder un historique minimal.
- Keep tags matching : Expression régulière pour les tags qui ne doivent jamais être supprimés (ex: main, latest).
- Remove tags older than : Seuil d'ancienneté à partir duquel un tag devient éligible à la suppression.
"Gestion des politiques de nettoyage du Registre de Conteneurs"
Conclusion
Le Container Registry est le point final de votre chaîne de production automatisée. C'est ici que sont conservées les versions prêtes à l'emploi de votre logiciel. En centralisant vos images au même endroit que votre code, vous sécurisez votre distribution et simplifiez radicalement vos pipelines de déploiement.
Vous maîtrisez désormais le cycle complet : coder, tester via la CI, construire l'image dans le Registry et déployer sur un serveur via la CD.
Espace commentaire
Écrire un commentaire
Rejoignez la discussion
Vous devez être connecté pour poster un message.
21 commentaires
Mon pipeline build prend 10 minutes. C'est normal ?
T'as activé le cache Docker ? Regarde cette config pour accélérer ton build :
Top, ça a réduit le temps de build de moitié. Merci !
Avec plaisir. Pense aussi à bien nettoyer les couches inutiles dans ton
Dockerfilepour alléger les images.Oui, mais tu perds la Sécurité Native et l'intégration des droits GitLab. Autant rester sur le Registry intégré.
Est-ce que je peux utiliser un registre externe comme DockerHub avec GitLab CI ?
C'est le plus propre. L'Agent utilise le token du service account GitLab pour s'authentifier. Fini la gestion manuelle des secrets.
Pour Kubernetes, si je ne veux pas mettre de mot de passe, l'Agent est obligatoire ?
Si ton serveur est en HTTPS avec un cert auto-signé, tu dois ajouter le CA dans
/etc/docker/certs.d/sur ton serveur cible.J'ai un souci de certificat lors du
docker pullsur mon serveur privé. Il ne reconnaît pas le registre GitLab.Utilise les
Cleanup Policiesdans les Settings. Tu peux définir une regex pour garder les tagsmainetprodintacts.Comment on fait pour purger les vieilles images automatiquement sans tout casser ?
Exact, et vérifie que ton Runner est configuré en mode
privileged = truedans ton fichierconfig.tomldu Runner.J'ai eu le même souci. Il faut ajouter le service
docker:dinddans ton config. C'est bien écrit dans l'article.Mon build échoue sur
docker:dindavec un messageCannot connect to the Docker daemon. Quelqu'un a déjà vu ça ?$CI_COMMIT_REF_SLUGte permet d'avoir une image unique par branche. Ne jamais utiliser latest en production si tu veux éviter les surprises lors des déploiements.C'est quoi la différence entre
$CI_COMMIT_REF_SLUGet juste mettrelatest?T'as bien utilisé les variables
$CI_REGISTRY_USERet$CI_REGISTRY_PASSWORD? Ne code jamais tes identifiants en dur.Même erreur ici. J'ai ajouté
docker loginmais rien ne change.Vérifie tes permissions sur le projet. Si tu es en Runner partagé, assure-toi que le job est bien autorisé à écrire dans le registre.
J'ai testé le
.gitlab-ci.ymlmais je me mange une erreurdenied: requested access to the resource is deniedau moment du push. Une idée ?