Qu'est-ce que le BuildKit de Docker et pourquoi est-ce important ?

Docker BuildKit est un moteur de création d'images opt-in qui offre des améliorations substantielles par rapport au processus traditionnel. BuildKit crée des couches d'images en parallèle, accélérant le processus de construction global.

Qu'est-ce que BuildKit ?

BuildKit a été développé dans le cadre du projet Moby, un effort de Docker pour “assembler des systèmes de conteneurs spécialisés sans réinventer la roue”. Il a été annoncé en 2017 et a commencé à être livré avec Docker Engine dans la version 18.09 de 2018.

BuildKit se concentre sur l'amélioration des performances de construction, la gestion du stockage et l'extensibilité. Ses principales affirmations sont le traitement parallèle, la mise en cache plus avancée, une architecture enfichable et la récupération automatique de la mémoire. Ceux-ci se combinent dans un système de construction qui est plus efficace et plus extensible que le moteur d'origine.

Des couches qui n'ont pas d'impact les unes sur les autres peuvent être construites simultanément, ce qui réduit les temps d'attente pour la fin des étapes. BuildKit optimise également l'accès aux fichiers locaux que vous référencez avec les instructions COPY. Il suit les modifications que vous apportez et ne copie que les fichiers qui ont été modifiés depuis la dernière version, au lieu de transférer l'intégralité du contexte de construction.

BuildKit simplifie également les builds multi-plateformes. Vous pouvez fournir l'indicateur –platform pour spécifier les cibles pour lesquelles construire. BuildKit assemblera automatiquement un manifeste d'image approprié pour couvrir toutes les architectures spécifiées.

docker buildx –create –platform linux/amd64,linux/arm64 .

Comment fonctionne BuildKit ?

Les améliorations de performances de BuildKit’s sont facilitées par l'utilisation d'un format de définition de construction de bas niveau, appelé LLB. C'est un format binaire basé sur des graphiques qui relie des définitions de build complexes.

Publicité

Comme les couches sont directement liées, BuildKit facilite une comparaison plus rapide des graphiques de construction et du contenu qu'ils incluent. Le constructeur Dockerfile par défaut doit s'appuyer sur des heuristiques imprécises pour déterminer si deux images sont comparables.

Le LLB est complètement séparé du BuildKit “frontend.” L'interface prend une représentation lisible par l'homme d'une image, telle qu'un Dockerfile, et la convertit en un graphique LLB. Une fois qu'une LLB a été générée, elle peut être exportée et déplacée entre les environnements. L'exportation vers un registre permet aux clients frontaux d'acquérir une LLB existante pour améliorer encore les performances de la première génération.

Les détails techniques de la LLB sont assez complexes. La technologie sous-jacente est basée sur la théorie des graphes et la comparaison des sommes de contrôle. Vous n'avez pas besoin de le comprendre pour profiter de sa puissance : en tant qu'utilisateur final, les builds fonctionnent de la même manière que jamais, avec la commande docker build.

BuildKit crée toujours des images compatibles OCI qui sont portables dans différents environnements de conteneurs. Vous pouvez utiliser BuildKit pour créer n'importe quelle image Docker avec une base Linux. Les images Windows ne sont pas actuellement prises en charge.

Activation de la prise en charge de BuildKit

Il existe deux manières d'activer BuildKit. Si vous souhaitez créer une seule image avec la fonctionnalité, définissez la variable d'environnement DOCKER_BUILDKIT dans votre shell :

DOCKER_BUILDKIT=1 docker build . Publicité

Pour une utilisation à long terme, configurez le démon Docker pour utiliser BuildKit par défaut. Créez ou modifiez le fichier /etc/docker/daemon.json et ajoutez le contenu suivant à l'objet de configuration de niveau supérieur :

{ "fonctionnalités" : { "buildkit" : true } }

Rechargez la configuration du démon pour appliquer la modification :

systemctl reload docker

BuildKit sera désormais utilisé à la place du moteur de génération par défaut lorsque vous exécutez la commande docker build.

Vous pouvez savoir quand BuildKit est actif car il produit une sortie CLI différente pour le moteur normal. L'affichage de la progression de BuildKit offre une meilleure lisibilité et une visualisation claire du début et de la fin de chaque étape. Les informations incluent une ventilation du temps nécessaire pour construire chaque couche.

“docker buildx”

Vous pouvez également interagir avec BuildKit via les commandes docker buildx. Ceux-ci utiliseront toujours BuildKit. Le groupe de commandes dockerx expose les fonctionnalités avancées de BuildKit, y compris la possibilité de construire sur un hôte distant.

Un seul client BuildKit peut interagir avec plusieurs instances de générateur d'images distinctes. Cela facilite les builds multi-plateformes en vous permettant d'ajouter un générateur pour chaque architecture que vous ciblez.

Voici un exemple d'ajout d'un hôte distant en tant que cible BuildKit. Cela suppose que la machine cible dispose d'un socket Docker exposé sur le port TCP 2375. Vous pouvez référencer l'hôte à l'aide de n'importe quel identifiant de point de terminaison Docker ou du nom d'un contexte Docker (obtenu à partir du contexte docker ls). Ce dernier vous permet de vous appuyer sur des environnements cloud compatibles en les ajoutant en tant que contexte.

docker buildx create –name remote-builder tcp://my-docker-host:2375 Publicité

Vous pouvez sélectionner le générateur à utiliser avec la commande docker buildx use :

docker buildx use remote- builder

Ensuite, vous pouvez utiliser la commande build pour créer votre image sur l'instance de générateur sélectionnée :

docker buildx build .

Vous pouvez supprimer des instances de générateur à l'aide de docker buildx rm, en transmettant le nom du générateur. Les constructeurs sont répertoriés à l'aide de docker buildx ls ; vous pouvez utiliser docker buildx inspect pour obtenir des informations plus détaillées sur un constructeur spécifique.

Si vous souhaitez vérifier l'utilisation du disque de BuildKit, exécutez la commande docker buildx du. Vous pouvez effacer le cache de build pour libérer de l'espace de stockage avec docker buildx prune. Cela peut réduire les performances la prochaine fois que vous reconstruisez votre image, car les couches précédemment mises en cache seront reconstruites.

Construire des fonctionnalités

BuildKit ajoute quelques éléments de construction supplémentaires. des fonctionnalités de temps pour simplifier vos étapes Dockerfile.

Vous pouvez transmettre des données secrètes à l'aide de l'indicateur –secret. Cela permet à votre Dockerfile d'accéder à des valeurs sensibles sans les stocker dans l'image. La valeur n'est disponible qu'au moment de la construction.

docker build –secret id=demo-secret,src=demo-secret.txt . FROM my-image:latest RUN –mount=type=secret,id=demo-secret cat /run/secrets/demo-secrets Publicité

Ce Dockerfile fait référence à un secret appelé demo-secret. Sa valeur est lue à partir du fichier demo-secret.txt lorsque vous exécutez docker build. L'instruction RUN avec l'indicateur –mount permet d'accéder au secret. Le fichier est temporairement monté dans le répertoire /run/secrets.

BuildKit vous permet également de transférer l'agent SSH de votre hôte afin que vos instructions de construction puissent interagir avec les connexions distantes existantes. Passez l'indicateur –ssh à docker build et ajoutez –mount=type=ssh aux instructions RUN dans votre Dockerfile :

docker build –ssh . RUN –mount=type=ssh git clone git@example.com:/project.git

Ces fonctionnalités rendent la création d'images plus pratique sans affecter la sécurité globale. Le transfert d'agent SSH et les montages secrets ne sont disponibles que dans BuildKit ; il n'y a pas d'équivalent dans le moteur de construction par défaut.

Conclusion

BuildKit est le constructeur d'images Docker de nouvelle génération qui utilise un format binaire graphique pour accélérer les constructions. Bien que les performances varient considérablement pour chaque Dockerfile, vous pouvez vous attendre à des accélérations substantielles dans les cas où le traitement parallèle des calques d'image est possible.

L'architecture de BuildKit’s optimise certaines des dernières fonctionnalités de Dockerfile. Les builds en plusieurs étapes bénéficient du saut des étapes inutilisées, ce qui rend le processus plus efficace que le générateur standard.

Bien que BuildKit soit désormais stable, Docker n'est toujours pas livré avec par défaut. Assurez-vous de l'activer dans votre client Docker si vous souhaitez utiliser ses fonctionnalités. Il y a une proposition active pour faire de BuildKit le moteur de construction standard mais il y a encore des problèmes non résolus empêchant le changement.


Posted

in

by

Tags: