Comment utiliser la commande docker buildx debug build pour construire et inspecter des images

DockerDockerBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce lab, vous apprendrez à utiliser efficacement la commande docker buildx debug build pour construire et inspecter des images Docker. Vous commencerez par construire une image simple avec les paramètres par défaut en utilisant un Dockerfile.

En vous appuyant sur les bases, vous explorerez ensuite des scénarios de construction plus avancés, notamment l'incorporation d'arguments de build (build arguments) et d'étiquettes (labels) dans vos images. Vous apprendrez également comment cibler des plateformes spécifiques pendant le processus de construction et exporter l'image résultante dans un fichier. Enfin, le lab couvrira des techniques pour contrôler le cache de build et exposer de manière sécurisée des secrets (secrets) pendant la construction, offrant ainsi une compréhension complète des capacités de la commande docker buildx debug build.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/ImageOperationsGroup -.-> docker/save("Save Image") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555047{{"Comment utiliser la commande docker buildx debug build pour construire et inspecter des images"}} docker/inspect -.-> lab-555047{{"Comment utiliser la commande docker buildx debug build pour construire et inspecter des images"}} docker/images -.-> lab-555047{{"Comment utiliser la commande docker buildx debug build pour construire et inspecter des images"}} docker/save -.-> lab-555047{{"Comment utiliser la commande docker buildx debug build pour construire et inspecter des images"}} docker/build -.-> lab-555047{{"Comment utiliser la commande docker buildx debug build pour construire et inspecter des images"}} end

Construire une image simple avec les paramètres par défaut

Dans cette étape, vous apprendrez à construire une image Docker simple en utilisant un Dockerfile. Un Dockerfile est un document texte qui contient toutes les commandes qu'un utilisateur pourrait exécuter en ligne de commande pour assembler une image. Docker peut construire automatiquement des images en lisant les instructions d'un Dockerfile.

Commencez par naviguer vers le répertoire ~/project, qui est votre répertoire de travail pour ce lab.

cd ~/project

Maintenant, créons un Dockerfile simple. Nous allons créer un fichier nommé Dockerfile dans le répertoire ~/project. Ce Dockerfile définira les étapes pour créer une image basée sur l'image de base ubuntu et installer le paquet cowsay.

Utilisez l'éditeur nano pour créer et modifier le Dockerfile:

nano Dockerfile

Ajoutez le contenu suivant au Dockerfile:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "Hello, Docker!"]

Analysons ce Dockerfile:

  • FROM ubuntu:latest: Cette instruction spécifie l'image de base pour notre nouvelle image. Nous utilisons la dernière version de l'image officielle Ubuntu de Docker Hub.
  • RUN apt-get update && apt-get install -y cowsay: Cette instruction exécute des commandes dans une nouvelle couche au-dessus de l'image actuelle et enregistre les résultats. Ici, nous mettons à jour la liste des paquets et installons le paquet cowsay. Le drapeau -y répond automatiquement "oui" aux invites.
  • CMD ["cowsay", "Hello, Docker!"]: Cette instruction fournit les commandes par défaut pour un conteneur en cours d'exécution. Lorsqu'un conteneur est démarré à partir de cette image sans spécifier de commande, il exécutera cowsay "Hello, Docker!".

Enregistrez le fichier en appuyant sur Ctrl + X, puis Y, et Entrée.

Maintenant que nous avons notre Dockerfile, nous pouvons construire l'image. Utilisez la commande docker build. Le . à la fin de la commande indique à Docker de chercher le Dockerfile dans le répertoire courant (~/project). Nous allons également étiqueter l'image avec un nom, par exemple my-cowsay-image.

docker build -t my-cowsay-image .

Cette commande exécutera les instructions du Dockerfile étape par étape. Vous verrez une sortie indiquant chaque étape traitée, y compris le téléchargement de l'image de base (si elle n'est pas déjà présente) et l'installation de cowsay.

Une fois le processus de construction terminé, vous pouvez vérifier que l'image a été créée avec succès en listant les images disponibles à l'aide de la commande docker images:

docker images

Vous devriez voir my-cowsay-image dans la sortie.

Enfin, lançons un conteneur à partir de l'image que nous venons de construire pour vérifier son fonctionnement.

docker run my-cowsay-image

Cette commande créera et démarrera un nouveau conteneur basé sur my-cowsay-image. Comme nous avons défini une instruction CMD dans notre Dockerfile, le conteneur exécutera automatiquement cowsay "Hello, Docker!", et vous devriez voir la vache dire "Hello, Docker!" dans la sortie de votre terminal.

Construire une image avec des arguments de build et des labels

Dans cette étape, vous apprendrez à utiliser des arguments de build (ARG) et des labels (LABEL) dans votre Dockerfile. Les arguments de build vous permettent de passer des variables au processus de construction, rendant votre Dockerfile plus flexible. Les labels sont des paires clé-valeur que vous pouvez attacher à une image pour ajouter des métadonnées.

Commencez par vous assurer que vous êtes dans le répertoire ~/project:

cd ~/project

Maintenant, modifions le Dockerfile créé à l'étape précédente. Nous allons ajouter un argument de build pour personnaliser le message affiché par cowsay et ajouter un label à l'image.

Ouvrez le Dockerfile pour le modifier:

nano Dockerfile

Modifiez le contenu pour inclure les instructions ARG et LABEL:

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
CMD ["cowsay", "$MESSAGE"]

Examinons les modifications:

  • ARG MESSAGE="Hello, Docker!": Cette instruction définit un argument de build nommé MESSAGE avec une valeur par défaut "Hello, Docker!". Cette valeur peut être remplacée pendant le processus de build.
  • LABEL maintainer="Your Name <[email protected]>": Cette instruction ajoute un label à l'image. Les labels sont utiles pour ajouter des informations comme le mainteneur, la version ou toute autre métadonnée pertinente.
  • CMD ["cowsay", "$MESSAGE"]: Nous avons modifié l'instruction CMD pour utiliser la valeur de l'argument de build MESSAGE.

Enregistrez le Dockerfile modifié en appuyant sur Ctrl + X, puis Y, et Entrée.

Maintenant, reconstruisons l'image, mais cette fois en passant une valeur pour l'argument de build MESSAGE en utilisant le flag --build-arg. Nous lui donnerons également un nouveau tag, my-custom-cowsay-image.

docker build --build-arg MESSAGE="Building with arguments!" -t my-custom-cowsay-image .

Observez la sortie pendant le processus de build. Vous devriez voir que l'instruction ARG est traitée et que la valeur de MESSAGE est définie sur "Building with arguments!".

Une fois le build terminé, lançons un conteneur à partir de cette nouvelle image:

docker run my-custom-cowsay-image

Cette fois, le conteneur devrait afficher le message personnalisé "Building with arguments!".

Vous pouvez également inspecter l'image pour voir les labels ajoutés. Utilisez la commande docker inspect suivie du nom de l'image:

docker inspect my-custom-cowsay-image

Dans la sortie, cherchez la section "Labels". Vous devriez trouver le label maintainer avec la valeur spécifiée dans le Dockerfile.

Construire une image ciblant une plateforme spécifique et l'exporter vers un fichier

Dans cette étape, vous apprendrez à construire une image Docker pour une plateforme spécifique et comment exporter l'image construite vers un fichier. La construction pour différentes plateformes est utile lorsque vous devez déployer votre application sur des systèmes avec des architectures différentes (par exemple ARM vs x86). L'export vers un fichier vous permet de sauvegarder l'image sous forme d'archive tar, qui peut être facilement transférée et chargée dans un autre environnement Docker.

Commencez par vous assurer que vous êtes dans le répertoire ~/project:

cd ~/project

Nous utiliserons le même Dockerfile que lors de l'étape précédente. Vous pouvez visualiser son contenu avec la commande cat:

cat Dockerfile

Le résultat devrait être:

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
CMD ["cowsay", "$MESSAGE"]

Maintenant, construisons l'image spécifiquement pour la plateforme linux/arm64. Nous utiliserons le flag --platform. Notez que la construction pour une plateforme différente nécessite Docker Buildx, qui est généralement inclus dans les installations récentes de Docker.

docker build --platform linux/arm64 -t my-arm64-cowsay-image .

Cette commande construira l'image pour l'architecture ARM64. Vous verrez une sortie similaire aux constructions précédentes, mais le processus cible une architecture différente.

Une fois la construction terminée, vous pouvez lister vos images pour voir la nouvelle image créée. Notez que la colonne ARCHITECTURE affichera arm64 pour cette image.

docker images

Ensuite, exportons cette image vers un fichier tar. Ceci est utile pour sauvegarder et partager des images sans utiliser de registry. Nous utiliserons le flag --output avec l'option type=tar.

docker build --platform linux/arm64 -t my-arm64-cowsay-image . --output type=tar,dest=my-arm64-cowsay-image.tar

Cette commande reconstruit l'image (en utilisant potentiellement le cache de construction) puis la sauvegarde sous forme de fichier tar nommé my-arm64-cowsay-image.tar dans le répertoire ~/project.

Vous pouvez vérifier que le fichier tar a été créé avec la commande ls:

ls -lh my-arm64-cowsay-image.tar

Vous devriez voir le fichier listé avec sa taille. Ce fichier tar contient toutes les couches de my-arm64-cowsay-image. Vous pouvez ensuite transférer ce fichier vers une autre machine et le charger avec docker load -i my-arm64-cowsay-image.tar.

Construire une image avec contrôle du cache et gestion des secrets

Dans cette étape, vous apprendrez à contrôler le cache de construction Docker et à gérer les secrets pendant le processus de build en utilisant le type de montage secret de BuildKit. Le cache de build peut accélérer considérablement les constructions, mais il est parfois nécessaire de le désactiver. La gestion sécurisée des secrets est cruciale pour éviter d'intégrer des informations sensibles dans les couches de votre image.

Commencez par vous assurer que vous êtes dans le répertoire ~/project:

cd ~/project

Modifions le Dockerfile pour inclure une étape dont nous pourrions vouloir contrôler la mise en cache et démontrer la gestion des secrets. Nous ajouterons une étape simple de création de fichier et une étape hypothétique utilisant un secret.

Ouvrez le Dockerfile pour le modifier:

nano Dockerfile

Modifiez le contenu pour inclure une commande RUN qui crée un fichier avec un horodatage et un espace réservé pour l'utilisation d'un secret:

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
RUN echo "Build time: $(date)" > /app/build_info.txt
## Ceci est un espace réservé pour une commande utilisant un secret
## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt
CMD ["cowsay", "$MESSAGE"]

Nous avons ajouté RUN echo "Build time: $(date)" > /app/build_info.txt. Cette commande crée un fichier /app/build_info.txt contenant l'horodatage de la construction de cette couche. Par défaut, Docker met en cache les couches. Si vous construisez l'image plusieurs fois sans modifier les instructions avant cette commande RUN, cette couche pourrait être servie depuis le cache et l'horodatage ne sera pas mis à jour.

Enregistrez le Dockerfile modifié en appuyant sur Ctrl + X, puis Y, et Entrée.

Maintenant, construisons l'image avec un nouveau tag, my-cached-image.

docker build -t my-cached-image .

Observez la sortie. Si vous avez construit l'image récemment, vous pourriez voir ---> Using cache pour certaines étapes.

Pour démontrer le contrôle du cache, reconstruisons l'image, mais cette fois en désactivant le cache pour l'ensemble de la construction avec le flag --no-cache.

docker build --no-cache -t my-no-cache-image .

Vous verrez que Docker reconstruit chaque couche, même si les instructions n'ont pas changé. Ceci est utile lorsque vous voulez vous assurer que toutes les dépendances sont récupérées à nouveau ou lorsqu'une construction précédente a échoué d'une manière qui a corrompu le cache.

Abordons maintenant la gestion des secrets. La ligne commentée ## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt montre comment utiliser un secret avec BuildKit. Pour utiliser cette fonctionnalité, vous devez activer BuildKit (souvent activé par défaut dans les versions récentes de Docker) et fournir le secret pendant la construction avec le flag --secret.

Par exemple, si vous aviez un fichier mysecret.txt contenant votre secret, vous construiriez comme ceci (cette commande ne fonctionnera pas telle quelle car nous n'avons pas de fichier mysecret.txt et la ligne est commentée, mais elle montre la syntaxe):

## docker build --secret id=mysecret,src=mysecret.txt -t my-secret-image .

L'instruction RUN --mount=type=secret,id=mysecret rend le contenu du secret disponible à /run/secrets/mysecret uniquement pendant l'étape de construction. Le secret n'est pas inclus dans les couches finales de l'image. C'est la méthode sécurisée pour gérer des informations sensibles comme des clés API ou des mots de passe pendant les constructions.

Comme nous n'avons pas de fichier secret et que la ligne est commentée, nous n'exécuterons pas la commande de construction liée aux secrets. Cependant, comprendre les concepts de --no-cache et du type de montage secret est important pour contrôler vos constructions et gérer les données sensibles.

Résumé

Dans ce lab, vous avez appris les fondamentaux de la construction d'images Docker à l'aide d'un Dockerfile. Vous avez commencé par créer un simple Dockerfile basé sur Ubuntu, en installant un paquet et en définissant une commande par défaut. Cela vous a permis de découvrir les instructions principales FROM, RUN et CMD, ainsi que la manière de construire une image en utilisant docker build avec un tag.

En approfondissant les bases, vous avez exploré des techniques plus avancées de construction d'images. Vous avez appris à intégrer des arguments de build (build arguments) et des labels dans votre Dockerfile pour personnaliser le processus de construction et ajouter des métadonnées à l'image. Vous avez également pratiqué la construction d'images pour des plateformes spécifiques et l'export de l'image résultante vers un fichier, démontrant ainsi comment contrôler la sortie du build. Enfin, vous avez étudié la gestion du cache de build et la manipulation sécurisée des secrets pendant le processus de construction, mettant en lumière les bonnes pratiques pour une création d'images efficace et sécurisée.