GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Docker Cache - Comment faire une reconstruction d'image propre et vider le cache Dockers

Les conteneurs vous permettent de conditionner votre application d'une manière portable qui peut s'exécuter dans de nombreux environnements. La plate-forme de conteneurs la plus populaire est Docker.

Ce tutoriel vous expliquera comment utiliser le cache de build Docker à votre avantage.

Cache de construction Docker

La création d'images doit être rapide, efficace et fiable. Le concept d'images Docker est livré avec des couches immuables. Chaque commande que vous exécutez entraîne la création d'un nouveau calque contenant les modifications par rapport au calque précédent.

Toutes les couches précédemment créées sont mises en cache et peuvent être réutilisées. Mais, si votre installation dépend de ressources externes, le cache Docker peut causer des problèmes.

Comment tirer parti du cache de construction Docker

Pour comprendre les problèmes de cache de construction de Docker, construisons une application Docker nginx personnalisée simple. Avant de créer l'image, créez un Dockerfile qui met à jour les bibliothèques et ajoute une page de démarrage personnalisée :

FROM nginx:1.21.6

# Update all packages
RUN apt-get update && apt-get -y upgrade

# Use a custom startpage
RUN echo '<html><bod>My Custom Startpage</body></html>' > /usr/share/nginx/html/index.html

Vous pouvez maintenant créer l'image Docker :

$  docker build -t my-custom-nginx .

=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e12...  5.8s
=> [2/3] RUN apt-get update && apt-get -y upgrade           3.6s
=> [3/3] RUN echo '<html><bod>My Custom Startpage...        0.2s

=> exporting to image                                       0.1s
=> exporting layers                                         0.1s
=> writing image                                            0.0s
=> naming to docker.io/library/my-custom-nginx

[+] Building 11.3s (7/7) FINISHED

Dans cet exemple, j'ai supprimé certaines sorties pour des raisons de lisibilité. Si vous construisez l'image la première fois, vous voyez que cela prend un certain temps, dans mon cas 11.3s .

Une longue étape d'exécution est apt-get update && apt-get -y upgrade en fonction du nombre de dépendances mises à jour et de la vitesse de votre connexion Internet. Il vérifie les mises à jour de packages sur le système d'exploitation et les installe si elles sont disponibles.

Maintenant, vous l'exécutez à nouveau, et vous bénéficiez du build cache de Docker :

$ docker build -t my-custom-nginx .

=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1…   0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade        0.0s
=> CACHED [3/3] RUN echo '<html><bod>My Custom Startpage...     0.0s

=> exporting to image                                           0.0s
=> exporting layers                                             0.0s
=> writing image                                                0.0s
=> naming to docker.io/library/my-custom-nginx

Building 1.1s (7/7) FINISHED

Cette fois, la construction de l'image est très rapide car elle peut réutiliser toutes les images précédemment construites. Lorsque vous personnalisez votre page de démarrage dans le Dockerfile, vous voyez comment le comportement de mise en cache est affecté :

FROM nginx:1.21.6

# Update all packages
RUN apt-get update && apt-get -y upgrade

# Use a custom startpage
RUN echo '<html><bod>New Startpage</body></html>' > /usr/share/nginx/html/index.html

Maintenant, reconstruisez l'image :

$ docker build -t my-custom-nginx .

=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1…   0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade        0.0s
=> [3/3] RUN echo '<html><bod>My Custom Startpage...            0.2s

=> exporting to image                                           0.0s
=> exporting layers                                             0.0s
=> writing image                                                0.0s
=> naming to docker.io/library/my-custom-nginx

Building 2.1s (7/7) FINISHED

Cette fois, il n'a reconstruit que la dernière couche car il a reconnu que le RUN la commande avait changé. Mais, il a réutilisé la deuxième étape de construction intense et n'a pas mis à jour les dépendances du système d'exploitation.

Le comportement de mise en cache est intelligent. Une fois qu'une étape doit être reconstruite, chaque étape suivante est reconstruite. Par conséquent, il est bon de mettre les pièces qui changent fréquemment à la fin d'un Dockerfile pour réutiliser les couches de construction précédentes.

Néanmoins, vous souhaitez peut-être forcer la reconstruction d'une couche mise en cache pour forcer une mise à jour du package. Forcer une reconstruction peut être nécessaire car vous souhaitez protéger votre application et utiliser les dernières mises à jour lorsqu'elles sont disponibles.

Comment utiliser la construction Docker --no-cache Options

Il peut y avoir différentes raisons pour désactiver le build-cache. Vous pouvez reconstruire l'image à partir de l'image de base sans utiliser de calques mis en cache en utilisant le --no-cache option.

$ docker build -t my-custom-nginx .

=> CACHED [1/3] FROM docker.io/library/nginx:1.21.6@sha256:...  0.0s
=> [2/3] RUN apt-get update && apt-get -y upgrade               3.5s
=> [3/3] RUN echo '<html><bod>My Custom Startpage...            0.2s

=> exporting to image                                           0.1s
=> exporting layers                                             0.0s
=> writing image                                                0.0s
=> naming to docker.io/library/my-custom-nginx

Building 5.5s (7/7) FINISHED

De nouvelles couches ont été construites et utilisées. La docker build exécute les deux commandes cette fois, ce qui s'accompagne d'une approche tout ou rien. Soit vous fournissez le --no-cache option qui exécute toutes les commandes, ou vous mettrez en cache autant que possible.

Comment utiliser les arguments Docker pour le contournement du cache

Une autre option permet de fournir un petit point de départ dans le Dockerfile. Vous devez modifier votre Dockerfile comme ceci :

FROM nginx:1.21.6

# Update all packages
RUN apt-get update && apt-get -y upgrade

# Custom cache invalidation
ARG CACHEBUST=1

# Use a custom startpage
RUN echo '<html><bod>New Startpage</body></html>' > /usr/share/nginx/html/index.html

Vous ajoutez un CACHEBUST argument à votre Dockerfile à l'emplacement où vous souhaitez appliquer une reconstruction. Maintenant, vous pouvez créer l'image Docker et fournir une valeur toujours différente qui entraîne la réexécution de toutes les commandes suivantes :

$ docker build -t my-custom-nginx --build-arg CACHEBUST=$(date +%s) .

=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1...    0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade           0.0s
=> [3/3] RUN echo '<html><bod>My Custom Startpage...               0.3s

=> exporting to image                                              0.0s
=> exporting layers                                                0.0s
=> writing image                                                   0.0s
=> naming to docker.io/library/my-custom-nginx

Building 1.0s (7/7) FINISHED

En fournissant --build-arg CACHEBUST=$(date +%s) , vous définissez le paramètre sur une valeur toujours différente qui entraîne la reconstruction de toutes les couches suivantes.


Docker
  1. Comment déplacer des images Docker entre les hôtes

  2. Comment empaqueter et transférer des images Docker d'un serveur à un autre

  3. Comment modifier les images Docker

  4. Comment valider les modifications apportées à une image Docker

  5. Comment créer et configurer automatiquement des images Docker personnalisées avec Dockerfile - Partie 3

Comment installer KernelCare et vider le cache Kernelcare sous Linux

Comment installer et utiliser Docker sur Ubuntu 22.04

Comment nettoyer et supprimer des images Docker

Comment réduire la taille de l'image Docker dans les conteneurs Docker

Comment utiliser Docker Enregistrer l'image et l'exporter pour le partage

Comment créer et envoyer une image Docker au référentiel Docker Hub