Aller au contenu principal

Construction d'image

Gabarit qui construit une image à partir d'un Dockerfile et la pousse vers le registre de l'instance, sans démon Docker ni mode privilégié : il tourne sur un runner Docker ordinaire (tag docker).

La construction est faite par kaniko, dans sa version maintenue (le kaniko de Google est archivé depuis 2025). Kaniko exécute les instructions du Dockerfile dans son propre conteneur, puis pousse l'image avec le jeton du job (CI_REGISTRY_USER / CI_REGISTRY_PASSWORD).

Le fichier ne définit aucun job concret : il fournit le job caché .image-build, que le projet étend avec ses propres règles.

Utilisation​

include:
- project: kgaut/gitlab-ci-templates
ref: *CI_TEMPLATE_VERSION
file:
- '/templates/generic/stages-variables-extends.yml'
- '/templates/generic/image-build.yml'

build-image:
extends: .image-build
variables:
IMAGE_BUILD_DOCKERFILE: docker/app.dockerfile
IMAGE_BUILD_DESTINATION: $CI_REGISTRY_IMAGE/app:$CI_COMMIT_TAG $CI_REGISTRY_IMAGE/app:latest
rules:
- if: $CI_COMMIT_TAG

Sans IMAGE_BUILD_DESTINATION, l'image est construite sans être poussée : pratique pour vérifier un Dockerfile dans une merge request.

Variables​

Nom de la variableContenuExempleRemarque
IMAGE_BUILD_DOCKERFILEDockerfile, relatif à la racine du dépôtdocker/app.dockerfilepar défaut Dockerfile
IMAGE_BUILD_CONTEXTContexte de construction, relatif à la racine du dépôtdockerpar défaut .
IMAGE_BUILD_DESTINATIONRéférence(s) à pousser, séparées par des espaces$CI_REGISTRY_IMAGE/app:1.2.0vide par défaut : construction sans push
IMAGE_BUILD_KANIKO_IMAGEImage de kaniko utilisée par le jobghcr.io/osscontainertools/kaniko:v1.28.5-debugvariante debug obligatoire (shell)

Limites​

  • Le push n'est authentifié que pour le registre de l'instance (CI_REGISTRY). Pour un autre registre, redéfinir le script du job.
  • Kaniko ne fait pas de construction multi-plateforme : l'image est construite pour l'architecture du runner.
  • Les RUN s'exécutent dans le conteneur du job : un Dockerfile qui a besoin de privilèges (montages, --privileged) ne se construit pas ainsi.

Liste des jobs​

.image-build​

Job caché (stage predeploy) : construction de IMAGE_BUILD_DOCKERFILE, puis push vers chaque référence de IMAGE_BUILD_DESTINATION.