Comment utiliser la commande docker builder prune pour supprimer le cache de construction

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 laboratoire (lab), vous apprendrez à gérer efficacement le cache de construction Docker en utilisant la commande docker builder prune. Nous commencerons par construire une simple image Docker pour comprendre comment le cache de construction est créé et utilisé pour accélérer les constructions suivantes.

Après la construction de l'image, vous explorerez différentes méthodes pour nettoyer le cache de construction. Cela inclut l'élimination du cache de construction orphelin (dangling build cache), la suppression de tout le cache de construction inutilisé et l'utilisation de filtres pour éliminer sélectivement le cache. Enfin, vous apprendrez à éliminer le cache de construction tout en préservant l'espace de stockage, ce qui vous offrira une compréhension complète des techniques de gestion du cache de construction.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/pull -.-> lab-555043{{"Comment utiliser la commande docker builder prune pour supprimer le cache de construction"}} docker/images -.-> lab-555043{{"Comment utiliser la commande docker builder prune pour supprimer le cache de construction"}} docker/prune -.-> lab-555043{{"Comment utiliser la commande docker builder prune pour supprimer le cache de construction"}} docker/build -.-> lab-555043{{"Comment utiliser la commande docker builder prune pour supprimer le cache de construction"}} end

Construire une image pour créer un cache de construction

Dans cette étape, nous allons construire une simple image Docker pour comprendre comment le cache de construction est créé. Docker utilise un cache de construction pour accélérer les constructions suivantes. Chaque instruction dans un Dockerfile crée une couche (layer), et si l'instruction n'a pas changé depuis la dernière construction, Docker peut réutiliser la couche existante depuis le cache.

Tout d'abord, accédez au répertoire ~/project si vous n'y êtes pas déjà.

cd ~/project

Maintenant, créons un simple Dockerfile. Nous l'appellerons Dockerfile.cache.

nano Dockerfile.cache

Ajoutez le contenu suivant au fichier Dockerfile.cache :

FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends curl
COPY . /app
WORKDIR /app
CMD ["curl", "https://www.example.com"]

Enregistrez le fichier et quittez l'éditeur nano (Appuyez sur Ctrl + X, puis Y, puis Entrée).

Ce Dockerfile effectue les opérations suivantes :

  • FROM ubuntu:latest : Commence avec la dernière image de base Ubuntu.
  • RUN apt-get update && apt-get install -y --no-install-recommends curl : Met à jour la liste des paquets et installe le paquet curl. Il s'agit d'une opération courante et sera probablement mise en cache lors des constructions suivantes si l'image de base et cette instruction ne changent pas.
  • COPY . /app : Copie le contenu du répertoire actuel dans le répertoire /app de l'image.
  • WORKDIR /app : Définit le répertoire de travail sur /app.
  • CMD ["curl", "https://www.example.com"] : Spécifie la commande à exécuter lorsqu'un conteneur est démarré à partir de cette image.

Avant de construire l'image, assurons-nous d'avoir l'image ubuntu:latest localement. Sinon, Docker la téléchargera automatiquement lors de la construction, mais la télécharger explicitement au préalable peut parfois rendre la sortie de la construction plus claire.

docker pull ubuntu:latest

Maintenant, construisons l'image en utilisant le fichier Dockerfile.cache. Nous allons étiqueter (tag) l'image comme myimage:cachetest.

docker build -t myimage:cachetest -f Dockerfile.cache .

Vous verrez une sortie indiquant les étapes du processus de construction. Docker exécutera chaque instruction dans le Dockerfile. Comme il s'agit de la première construction avec ce Dockerfile, Docker n'utilisera pas de cache de construction pour les couches définies dans ce Dockerfile.

Une fois la construction terminée, vous pouvez lister vos images pour voir la nouvelle image myimage:cachetest créée.

docker images

Vous devriez voir myimage avec l'étiquette cachetest dans la liste. Ce processus de construction a créé un cache de construction pour chaque couche définie dans le Dockerfile.cache. Dans les étapes suivantes, nous explorerons comment gérer ce cache de construction.

Éliminer le cache de construction orphelin (dangling build cache)

Dans cette étape, nous apprendrons à éliminer le cache de construction orphelin. Le cache de construction orphelin fait référence aux couches de cache de construction qui ne sont plus associées à aucune image nommée. Cela peut se produire lorsque vous reconstruisez une image et qu'une couche précédente est remplacée par une nouvelle. L'élimination du cache orphelin peut aider à libérer de l'espace disque.

Tout d'abord, modifions légèrement notre Dockerfile.cache pour créer un peu de cache orphelin. Nous allons changer l'instruction RUN.

Accédez au répertoire ~/project si vous n'y êtes pas déjà.

cd ~/project

Ouvrez le fichier Dockerfile.cache pour l'éditer.

nano Dockerfile.cache

Changez l'instruction RUN de :

RUN apt-get update && apt-get install -y --no-install-recommends curl

en :

RUN apt-get update && apt-get install -y --no-install-recommends wget

Enregistrez le fichier et quittez l'éditeur nano (Appuyez sur Ctrl + X, puis Y, puis Entrée).

Maintenant, reconstruisons l'image avec la même étiquette (tag).

docker build -t myimage:cachetest -f Dockerfile.cache .

Observez la sortie. Docker réutilisera probablement la couche FROM depuis le cache, mais l'instruction RUN a changé, donc il exécutera cette étape à nouveau, créant une nouvelle couche. La couche précédente créée par l'ancienne instruction RUN est maintenant un cache de construction orphelin car elle ne fait plus partie de l'image myimage:cachetest.

Pour voir le cache de construction, vous pouvez utiliser la commande docker builder prune --dry-run, bien que ce ne soit pas toujours facile de distinguer spécifiquement le cache orphelin sans des outils plus avancés ou une bonne compréhension de la sortie de BuildKit. Une façon plus simple de voir l'effet est d'éliminer le cache orphelin et de voir l'espace récupéré.

Pour éliminer uniquement le cache de construction orphelin, nous utilisons la commande docker builder prune avec l'option --filter dangling=true.

docker builder prune --filter dangling=true

Vous serez invité à confirmer l'action. Tapez y et appuyez sur Entrée.

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

La sortie montrera la quantité d'espace récupéré. Cet espace était occupé par les couches de cache de construction orphelines qui n'étaient plus nécessaires.

En éliminant le cache de construction orphelin, vous pouvez récupérer de l'espace disque qui n'est plus utilisé par aucune couche d'image active.

Éliminer tout le cache de construction inutilisé

Dans cette étape, nous apprendrons à éliminer tout le cache de construction inutilisé. Alors que l'élimination du cache orphelin (dangling cache) supprime les couches non associées à aucune image, l'élimination de tout le cache inutilisé supprime tout cache de construction qui n'est pas actuellement utilisé par un conteneur en cours d'exécution ou référencé par une image locale. C'est une méthode plus radicale pour libérer de l'espace disque.

Tout d'abord, créons une autre image en utilisant un autre Dockerfile pour ajouter plus de cache de construction.

Accédez au répertoire ~/project si vous n'y êtes pas déjà.

cd ~/project

Créez un nouveau Dockerfile nommé Dockerfile.another.

nano Dockerfile.another

Ajoutez le contenu suivant à Dockerfile.another :

FROM alpine:latest
RUN apk update && apk add --no-cache git
COPY . /app2
WORKDIR /app2
CMD ["git", "--version"]

Enregistrez le fichier et quittez l'éditeur nano (Appuyez sur Ctrl + X, puis Y, puis Entrée).

Ce Dockerfile utilise l'image de base alpine et installe git.

Maintenant, construisons une image en utilisant ce nouveau Dockerfile. Nous allons l'étiqueter (tag) comme anotherimage:latest.

docker build -t anotherimage:latest -f Dockerfile.another .

Cette construction créera de nouvelles couches de cache de construction spécifiques à ce Dockerfile.

Pour éliminer tout le cache de construction inutilisé, nous utilisons la commande docker builder prune sans aucun filtre.

docker builder prune -a

Le drapeau -a signifie "tout" et indique que vous souhaitez supprimer tout le cache de construction inutilisé, pas seulement le cache orphelin.

Vous serez invité à confirmer l'action. Tapez y et appuyez sur Entrée.

WARNING! This will remove all unused build cache.
Are you sure you want to continue? [y/N] y

La sortie montrera la quantité d'espace récupéré. Cette commande supprime toutes les couches de cache de construction qui ne sont pas actuellement référencées par une image locale ou un conteneur en cours d'exécution. Cela peut libérer une quantité importante d'espace disque, notamment après de nombreuses constructions et mises à jour d'images.

Gardez à l'esprit que l'élimination de tout le cache inutilisé peut signifier que les constructions suivantes d'images que vous avez toujours localement peuvent prendre plus de temps si elles dépendaient des couches de cache supprimées.

Éliminer le cache de construction avec des filtres

Dans cette étape, nous allons explorer comment éliminer le cache de construction en utilisant des filtres. Les filtres vous permettent de supprimer sélectivement le cache de construction en fonction de certains critères, vous donnant un contrôle plus précis sur ce qui est supprimé.

Nous avons déjà vu le filtre dangling=true dans une étape précédente. Un autre filtre utile est until, qui vous permet de supprimer le cache de construction créé avant un horodatage (timestamp) spécifique.

Tout d'abord, reconstruisons notre image myimage:cachetest pour nous assurer d'avoir un cache de construction récent.

Accédez au répertoire ~/project si vous n'y êtes pas déjà.

cd ~/project

Reconstruisez l'image :

docker build -t myimage:cachetest -f Dockerfile.cache .

Maintenant, simulons un scénario où vous souhaitez supprimer le cache de construction plus ancien qu'un certain moment. À des fins de démonstration, nous utiliserons un filtre pour supprimer le cache plus ancien de quelques minutes.

Pour éliminer le cache de construction plus ancien qu'un certain moment, vous pouvez utiliser l'option --filter until=<timestamp>. L'horodatage peut être au format de durée, comme 5m (5 minutes) ou 2h (2 heures).

Éliminons le cache de construction plus ancien de 5 minutes.

docker builder prune --filter until=5m

Vous serez invité à confirmer l'action. Tapez y et appuyez sur Entrée.

WARNING! This will remove all build cache created before 5 minutes ago.
Are you sure you want to continue? [y/N] y

La sortie montrera la quantité d'espace récupéré du cache de construction plus ancien de 5 minutes. Si vous venez de construire l'image, il peut n'y avoir pas beaucoup de cache plus ancien de 5 minutes, mais dans un scénario réel avec de nombreuses constructions au fil du temps, ce filtre peut être très utile pour nettoyer l'ancien cache.

Vous pouvez également combiner des filtres. Par exemple, pour éliminer le cache orphelin (dangling cache) plus ancien qu'un certain moment, vous pourriez utiliser :

docker builder prune --filter dangling=true --filter until=24h

Cela supprimerait uniquement le cache de construction orphelin plus ancien de 24 heures.

L'utilisation de filtres offre une flexibilité dans la gestion de votre cache de construction et vous aide à libérer de l'espace disque de manière plus stratégique.

Éliminer le cache de construction tout en conservant de l'espace de stockage

Dans cette étape, nous apprendrons à éliminer le cache de construction tout en conservant une certaine quantité d'espace de stockage. Cela est utile lorsque vous souhaitez libérer de l'espace disque tout en conservant un peu de cache de construction récent pour accélérer les constructions futures.

La commande docker builder prune dispose d'une option --keep-storage qui vous permet de spécifier la quantité maximale d'espace de stockage à conserver pour le cache de construction. Vous pouvez spécifier la taille en octets ou utiliser des unités telles que k, m ou g.

Tout d'abord, assurons-nous d'avoir un peu de cache de construction à éliminer. Nous avons construit des images dans les étapes précédentes, ce qui a créé du cache.

Accédez au répertoire ~/project si vous n'y êtes pas déjà.

cd ~/project

Pour éliminer le cache de construction tout en conservant une quantité spécifique d'espace de stockage, utilisez l'option --keep-storage suivie de la taille souhaitée. Par exemple, pour conserver un maximum de 1 Go de cache de construction :

docker builder prune --keep-storage 1g

Vous serez invité à confirmer l'action. Tapez y et appuyez sur Entrée.

WARNING! This will remove all build cache exceeding 1GB.
Are you sure you want to continue? [y/N] y

La sortie montrera la quantité d'espace récupéré. Docker supprimera les couches de cache de construction les plus anciennes jusqu'à ce que la taille totale du cache de construction soit inférieure à la limite spécifiée par --keep-storage.

Vous pouvez ajuster la valeur de --keep-storage en fonction de l'espace disque disponible et de la quantité de cache que vous souhaitez conserver pour des constructions plus rapides. Par exemple, pour conserver un maximum de 500 Mo :

docker builder prune --keep-storage 500m

Confirmez à nouveau l'action en tapant y et en appuyant sur Entrée.

Cette méthode offre un équilibre entre la libération d'espace disque et le maintien d'un peu de cache de construction pour des performances optimales. Il est recommandé de régulièrement éliminer votre cache de construction pour éviter qu'il ne consomme trop d'espace disque.

Résumé

Dans ce laboratoire (lab), nous avons appris à utiliser la commande docker builder prune pour gérer le cache de construction Docker. Nous avons commencé par construire une simple image Docker en utilisant un Dockerfile afin de comprendre comment le cache de construction est créé et utilisé par Docker pour accélérer les constructions suivantes. Chaque instruction dans le Dockerfile crée une couche, et Docker réutilise les couches existantes du cache si l'instruction n'a pas changé.

Nous avons ensuite exploré différentes méthodes pour éliminer le cache de construction. Nous avons appris à éliminer le cache de construction orphelin (dangling build cache), qui désigne les entrées de cache qui ne sont plus associées à aucune construction. Nous avons également vu comment éliminer tout le cache de construction inutilisé, nettoyant ainsi efficacement toutes les entrées de cache qui ne sont pas actuellement utilisées par aucune image. De plus, nous avons démontré comment utiliser des filtres avec la commande prune pour supprimer sélectivement le cache de construction en fonction de critères spécifiques. Enfin, nous avons exploré l'option d'éliminer le cache de construction tout en conservant l'espace de stockage associé à certaines entrées de cache, ce qui peut être utile dans des scénarios particuliers.