Les images Docker avec la CI/CD
Mon premier build avec kaniko
Si vous souhaitez intégrer la construction de vos images Docker dans votre CI/CD, c'est bien évidemment possible! Il vous faudra utiliser une image "Kaniko". Vous pouvez en apprendre plus en vous rendant sur la page du projet.
Pour réaliser votre build, il faudra tout simplement modifier votre fichier .gitlab-ci.yaml de cette façon:
build:
stage: build
image:
name: gcr.io/kaniko-project/executor:v1.20.0-debug
entrypoint: [""]
tags:
- kaniko
script:
- /kaniko/executor
--context "${CI_PROJECT_DIR}"
--dockerfile "${CI_PROJECT_DIR}/Dockerfile"
--destination "${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}"
Qu'est-ce qui est important dans le code ci-dessus:
- image name: le nom de l'image Kaniko a utilisé. Actuellement la version "gcr.io/kaniko-project/executor:v1.12.1-debug"
- image entrypoint: il est nécessaire de mettre un tableau vide afin de pouvoir exécuter les commandes du script
- tags: une liste de tags pour utiliser un runner dédié
-
script: la commande /kaniko/executor avec ses paramètres
- --context: le contexte de build, typiquement pour des COPY...
- --dockerfile: chemin vers votre Dockerfile, il peut être à la source de votre repository comme dans l'exemple ou dans un sous-dossier
- --destination: où est-ce que le résultat sera envoyé, dans cet exemple l'image sera envoyée dans le registry de la forge mais il est aussi possible de l'envoyer vers un registry externe.
- docker_ci_build
- docker_build
- kaniko
- docker_image
Comment nommer mon image
Si vous avez l'habitude d'utiliser le Docker Hub, vous avez déjà vu que les images peuvent utiliser de nombreux noms, il est bien évidemment possible d'en exposer plusieurs notammment si votre projet fonctionne avec des microservices. Vous trouverez ci-dessous les différentes possibilités:
Utiliser mon image depuis le registry de la forge
Si vous avez utilisé le registry de la forge, vous pouvez consulter la bonne création de l'image en suivant le chemin suivant: Packages and registries (1) > Container Registry(2) > Copy Icon(3)
docker pull forge.univ-lyon1.fr:4567/doc-cicd/kaniko
# exemple d'un run
docker run forge.univ-lyon1.fr:4567/doc-cicd/kaniko cat /root.conf
docker: Error response from daemon: Head "https://forge.univ-lyon1.fr:4567/v2/doc-cicd/kaniko/manifests/latest": denied: access forbidden.
See 'docker run --help'.
Username: doc-demo
Password:
WARNING! Your password will be stored unencrypted in /home/doc-cicd/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
docker pull forge.univ-lyon1.fr:4567/doc-cicd/kaniko
# exemple d'un run
docker run forge.univ-lyon1.fr:4567/doc-cicd/kaniko cat /root.conf
Utiliser mon image pendant mon pipeline de CI/CD
Pour utiliser votre image, il suffit de simplement utiliser le keyword image. Si votre dépôt est privé, il ne sera pas nécessaire de vous authentifier, la CI/CD le fera automatiquement. Ce qui donne l'exemple suivant:
build:
stage: build
image:
name: gcr.io/kaniko-project/executor:v1.12.1-debug
entrypoint: [""]
tags:
- kaniko
script:
- /kaniko/executor
--context "${CI_PROJECT_DIR}"
--dockerfile "${CI_PROJECT_DIR}/Dockerfile"
--destination "${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}"
deploy:
stage: deploy
image:
name: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}"
# Il est bien évidemment possible de mettre un nom en dur
# name: "${CI_REGISTRY_IMAGE}:latest"
# name: "forge.univ-lyon1.fr:4567/namespace/project/
# name: forge.univ-lyon1.fr:4567/doc-cicd/kaniko:latest
script:
- cat /root.conf
Sécuriser mon mot de passe "docker login"
sudo apt install libsecret-1-dev make golang
git clone https://github.com/docker/docker-credential-helpers.git
cd docker-credential-helpers
make secretservice
sudo cp bin/build/docker-credential-secretservice /usr/local/bin
sudo dnf install libsecret-devel make golang
git clone https://github.com/docker/docker-credential-helpers.git
cd docker-credential-helpers
make secretservice
sudo cp bin/build/docker-credential-secretservice /usr/local/bin
xcode-select --install
brew install golang
make osxkeychain
cp bin/build/docker-credential-osxkeychain /usr/local/bin/
Pourquoi avoir fait le choix de Kaniko
Kaniko a été choisi car c'est la solution proposant le meilleur niveau de sécurité pour les utilisateurs. L'ancienne solution présentait des exploitations possibles.
Dois je vraiment saisir les tags de cette documentation?
Il est en effet pas obligatoire d'utiliser les tags mentionnés ci-dessous. Mais utiliser ces tags vous permettra de réaliser la construction de votre image sur des runners dédiés à cet usage, plus puissant et avec une file d'attente moins congestionnée que les autres runners!
- docker_ci_build
- docker_build
- kaniko
- docker_image