Backends de stockage de cache
Pour garantir des constructions rapides, BuildKit met automatiquement en cache le résultat de la construction dans son propre cache interne. De plus, BuildKit prend également en charge l'exportation du cache de construction vers un emplacement externe, ce qui permet de l'importer dans des constructions futures.
Un cache externe devient presque essentiel dans les environnements de construction CI/CD. Ces environnements ont généralement peu ou pas de persistance entre les exécutions, mais il est toujours important de maintenir le temps d'exécution des constructions d'images aussi bas que possible.
Le pilote docker
par défaut prend en charge les backends de cache inline
, local
, registry
et
gha
, mais uniquement si vous avez activé le
magasin d'images containerd.
D'autres backends de cache nécessitent que vous sélectionniez un
pilote différent.
WarningSi vous utilisez des secrets ou des identifiants dans votre processus de construction, assurez-vous de les manipuler en utilisant l'option dédiée
--secret
. Gérer manuellement les secrets en utilisantCOPY
ouARG
pourrait entraîner des fuites d'identifiants.
Backends
Buildx prend en charge les backends de stockage de cache suivants :
-
inline
: intègre le cache de construction dans l'image.Le cache inline est poussé vers le même emplacement que le résultat de sortie principal. Cela ne fonctionne qu'avec l'exportateur
image
. -
registry
: intègre le cache de construction dans une image séparée, et le pousse vers un emplacement dédié distinct du résultat de sortie principal. -
local
: écrit le cache de construction dans un répertoire local sur le système de fichiers. -
gha
: téléverse le cache de construction vers le cache GitHub Actions (bêta). -
s3
: téléverse le cache de construction vers un bucket AWS S3 (non publié). -
azblob
: téléverse le cache de construction vers Azure Blob Storage (non publié).
Syntaxe de commande
Pour utiliser l'un des backends de cache, vous devez d'abord le spécifier lors de la construction avec l'option
--cache-to
pour exporter le cache vers votre backend de stockage de choix. Ensuite, utilisez l'option
--cache-from
pour importer le cache depuis le backend de stockage dans la construction actuelle. Contrairement au
cache local de BuildKit (qui est toujours activé), tous les backends de stockage de
cache doivent être explicitement exportés vers, et explicitement importés depuis.
Exemple de commande buildx
utilisant le backend registry
, avec importation et exportation
de cache :
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>[,parameters...] \
--cache-from type=registry,ref=<registry>/<cache-image>[,parameters...] .
WarningEn règle générale, chaque cache écrit à un certain emplacement. Aucun emplacement ne peut être écrit deux fois, sans écraser les données précédemment mises en cache. Si vous voulez maintenir plusieurs caches délimités (par exemple, un cache par branche Git), alors assurez-vous d'utiliser différents emplacements pour le cache exporté.
Caches multiples
BuildKit prend en charge plusieurs exportateurs de cache, vous permettant de pousser le cache vers plus d'une destination. Vous pouvez également importer depuis autant de caches distants que vous le souhaitez. Par exemple, un modèle courant consiste à utiliser le cache à la fois de la branche courante et de la branche principale. L'exemple suivant montre l'importation de cache depuis plusieurs emplacements en utilisant le backend de cache registry :
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>:<branch> \
--cache-from type=registry,ref=<registry>/<cache-image>:<branch> \
--cache-from type=registry,ref=<registry>/<cache-image>:main .
Options de configuration
Cette section décrit certaines options de configuration disponibles lors de la génération d'exportations de cache. Les options décrites ici sont communes à au moins deux ou plus types de backend. De plus, les différents types de backend prennent en charge des paramètres spécifiques également. Consultez la page détaillée sur chaque type de backend pour plus d'informations sur les paramètres de configuration qui s'appliquent.
Les paramètres communs décrits ici sont :
Mode de cache
Lors de la génération d'une sortie de cache, l'argument --cache-to
accepte une option mode
pour définir quelles couches inclure dans le cache exporté. Ceci est
pris en charge par tous les backends de cache sauf pour le cache inline
.
Le mode peut être défini sur l'une des deux options : mode=min
ou mode=max
. Par exemple,
pour construire le cache avec mode=max
avec le backend registry :
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>,mode=max \
--cache-from type=registry,ref=<registry>/<cache-image> .
Cette option n'est définie que lors de l'exportation d'un cache, en utilisant --cache-to
. Lors de
l'importation d'un cache (--cache-from
), les paramètres pertinents sont automatiquement
détectés.
En mode de cache min
(par défaut), seules les couches qui sont exportées dans l'image
résultante sont mises en cache, tandis qu'en mode de cache max
, toutes les couches sont mises en cache,
même celles des étapes intermédiaires.
Bien que le cache min
soit généralement plus petit (ce qui accélère les temps d'importation/exportation et
réduit les coûts de stockage), le cache max
est plus susceptible d'obtenir plus de hits de cache.
Selon la complexité et l'emplacement de votre construction, vous devriez expérimenter
avec les deux paramètres pour trouver les résultats qui vous conviennent le mieux.
Compression de cache
Les options de compression de cache sont les mêmes que les
options de compression de l'exportateur. Ceci est
pris en charge par les backends de cache local
et registry
.
Par exemple, pour compresser le cache registry
avec la compression zstd
:
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>,compression=zstd \
--cache-from type=registry,ref=<registry>/<cache-image> .
Types de média OCI
Les options OCI du cache sont les mêmes que les
options OCI de l'exportateur. Celles-ci sont
prises en charge par les backends de cache local
et registry
.
Par exemple, pour exporter un cache de type média OCI, utilisez la propriété oci-mediatypes
:
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>,oci-mediatypes=true \
--cache-from type=registry,ref=<registry>/<cache-image> .
Cette propriété n'a de sens qu'avec l'indicateur --cache-to
. Lors de la récupération
du cache, BuildKit détectera automatiquement les types de média corrects à utiliser.
Par défaut, le type de média OCI génère un index d'image pour l'image de cache.
Certains registres OCI, comme Amazon ECR, ne prennent pas en charge le type de média d'index d'image :
application/vnd.oci.image.index.v1+json
. Si vous exportez des images de cache vers
ECR, ou tout autre registre qui ne prend pas en charge les index d'images, définissez le
paramètre image-manifest
à true
pour générer un manifeste d'image unique
au lieu d'un index d'image pour l'image de cache :
$ docker buildx build --push -t <registry>/<image> \
--cache-to type=registry,ref=<registry>/<cache-image>,oci-mediatypes=true,image-manifest=true \
--cache-from type=registry,ref=<registry>/<cache-image> .
NoteDepuis BuildKit v0.21,
image-manifest
est activé par défaut.