Container Registry
GitLab embarque un registre Docker v2 nativement. Chaque projet dispose d'un registre prive accessible via les credentials GitLab. C'est l'une des integrations les plus utilisees : les pipelines CI buildent des images et les poussent dans le registre, les deploiements les recuperent.
Acces au registre
Le registre est accessible a registry.gitlab.example.com (si configure separement) ou gitlab.example.com:5050. L'authentification se fait avec les identifiants GitLab ou un deploy token.
docker login registry.gitlab.example.com
# Depuis un pipeline CI, les variables sont automatiquement disponibles
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRYWorkflow pipeline typique
variables:
IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
build-image:
stage: build
image: docker:27
services:
- docker:27-dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker build -t $IMAGE .
- docker push $IMAGE
- docker tag $IMAGE $CI_REGISTRY_IMAGE:latest
- docker push $CI_REGISTRY_IMAGE:latestKaniko (sans Docker-in-Docker)
Docker-in-Docker (dind) necessite des runners privilegies, ce qui pose des problemes de securite. Kaniko build des images Docker sans daemon et sans privileges root :
build-kaniko:
stage: build
image:
name: gcr.io/kaniko-project/executor:v1.23.2-debug
entrypoint: [""]
script:
- /kaniko/executor
--context "$CI_PROJECT_DIR"
--dockerfile "$CI_PROJECT_DIR/Dockerfile"
--destination "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"Kaniko lit les credentials depuis /kaniko/.docker/config.json. GitLab injecte automatiquement les credentials registry dans ce fichier si l'option est activee dans les parametres runner.
Nettoyage des images
Sans politique de nettoyage, le registre grossit indefiniment. GitLab propose une politique de cleanup configurable (Settings > Packages & Registries > Container Registry) : conserver N versions, supprimer les tags plus anciens que X jours, garder les tags matchant un pattern.
Le nettoyage peut aussi etre declenche par l'API ou depuis un job CI pour un controle plus fin.