From 0a0b2d55fb82af6a3ab8a09539f0c31f509de453 Mon Sep 17 00:00:00 2001 From: Mickael MASQUELIN <mickael.masquelin@univ-lille.fr> Date: Tue, 13 Jun 2023 07:04:30 +0200 Subject: [PATCH] feat(exercices): Ajout exercice build multi arch --- README.md | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f87a672..07e49bd 100644 --- a/README.md +++ b/README.md @@ -208,4 +208,47 @@ Essayez de faire un `chmod`. Qu'observez-vous ? Récupérez l'image de Trivy depuis le DockerHub (`aquasec/trivy`). Créez un répertoire local qui va recevoir la base de données des vulnérabilités de l'outil et montez celui-ci dans le répertoire `/root/.cache` d'un conteneur que vous appelerez `scanner`. -Effectuez maintenant un scan de toutes vulnérabilités de l'image `mysql:8.0` depuis le DockerHub (servez-vous de la slide qui présente des exemples d'utilisations de l'outil). Qu'observez-vous ? Faites à nouveau le test avec l'image `mysql:latest`. Quelle est votre conclusion ? \ No newline at end of file +Effectuez maintenant un scan de toutes vulnérabilités de l'image `mysql:8.0` depuis le DockerHub (servez-vous de la slide qui présente des exemples d'utilisations de l'outil). Qu'observez-vous ? Faites à nouveau le test avec l'image `mysql:latest`. Quelle est votre conclusion ? + +## Construire une image à destination de plusieurs architectures + +Vous pouvez, en une seule commande, lancer la construction d’images Docker à destination de plusieurs architectures (intel, arm, etc.). Pour rappel, **BuildKit** est le nouveau moteur de construction d’images intégrant pas mal de nouvelles fonctionnalités. + +### Mettre en place le builder + +Le générateur est en fait une image, utilisant les fonctionnalités QEMU. Elle tourne au sein d’une instance Docker. C'est une fonctionnalité que l’on retrouve sur la version de Docker Desktop d’ailleurs ... mais elle est cachée. + +Pour l'initialiser il faut, en premier lieu, lancer une image permettant d’installer l’outillage nécessaire sur la machine hôte. Cela se fait de la manière suivante : + +```bash +$ docker run --privileged --rm tonistiigi/binfmt:latest --install all +``` + +Vous obtiendrez, en sortie, toutes les builds possibles. Ensuite, il faut créer le builder. Pour utiliser un registre personnel il faudra utiliser un fichier de config (en ajoutant `--config=/path/to/config.toml`). Je vous invite à consulter [ce lien](https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md) pour plus d'infos. Il faudra procéder de la manière suivante : + +```bash +$ docker buildx create --driver-opt network=host --driver docker-container --name mybuilder --use mybuilder +``` + +Nous allons créer un `Dockerfile` très simple. Son contenu est le suivant : + +```bash +# syntax=docker/dockerfile:1.3 +FROM --platform=$BUILDPLATFORM golang:alpine AS build +ARG TARGETPLATFORM +ARG BUILDPLATFORM +RUN echo "Je suis exécuté sur $BUILDPLATFORM, je construis pour $TARGETPLATFORM" > /log +FROM alpine +COPY --from=build /log /log +``` + +Vous pouvez désormais lancer le build pour cette image de cette manière : + +```bash +# Pour avoir une image adaptée aux plateformes Intel/AMD : +$ docker buildx build --platform linux/amd64 -t masqueli/test-amd64:v1.0.0 --load . +# Pour avoir une image adaptée aux plateformes ARM : +$ docker buildx build --platform linux/arm64 -t masqueli/test-arm64:v1.0.0 --load . +``` + +Félicitations ! Vous êtes en mesure de délivrer des images multi-plateformes désormais :) \ No newline at end of file -- GitLab