Hacker News

BuildKit: La pèira preciosa amagada de Docker que pòt bastir gaireben tot

Comentaris

18 min read Via tuananh.net

Mewayz Team

Editorial Team

Hacker News

BuildKit: La pèira preciosa amagada de Docker que pòt bastir gaireben tot

La màger part dels desvolopaires coneisson Docker coma lo temps d'execucion del contenedor que cambièt cossí lo logicial es expediat. Fòrça mens sabon lo motor que ronca tranquillament jos la superfícia de cada version modèrna de Docker — BuildKit, lo sistèma de version de seguenta generacion qu'es expediat amb Docker dempuèi la version 18.09 e venguèt lo fons per defaut dins Docker 23.0. Del temps que los engenhaires discutisson sens fin sus las configuracions e los modèls de microservicis de Kubernetes, BuildKit a evolucionat de manièra constanta cap a un dels sistèmas de construccion mai poderoses e soples de l'ecosistèma DevOps. Se l'avètz tractat coma una build de docker mai rapida, daissatz una capacitat enòrma sus la taula. Las entrepresas que foncionan de pipelines CI/CD de naut debit an redusit los temps de construccion de 50–70% simplament en comprenent çò que BuildKit ofrís en realitat — e es pas que lo començament.

Qué fa que BuildKit siá fondamentalament diferent del Builder Classic

Lo motor de construccion Docker original executava las instruccions Dockerfile de manièra sequenciala, un calc a la volta, sens consciéncia de quin trabalh poiriá se debanar en seguretat en parallèl. BuildKit remplaça aquel modèl d'execucion lineara per un grafic aciclic dirigit (DAG) — un grafic de dependéncia que compren quinas etapas de construccion s'apièjan l'una sus l'autra e qualas non. Las estapas independentas s'executan simultanèament, las estapas non utilizadas son sautadas entièrament, e la construccion entièra ven una descripcion declarativa de çò que volètz puslèu qu'una sequéncia imperativa d'estapas que vos cal recitar dins l'òrdre corrècte.

Aquel cambiament arquitectural a de consequéncias practicas que van al delà de la velocitat. Quand un Dockerfile multiestadi compila un binari Go dins una estapa, telecarga de dependéncias Node.js dins una autra, e assembla una imatge de produccion dins una tresena, BuildKit pòt executar las doas primièras estapas a l'encòp. Una construccion que preniá abans quatre minutas sus un correire CI poderós s'acaba ara en mens de nonanta segondas. Stripe, Shopify, e de desenats d'autras còlas d'engenharia de nauta escala an documentat de ganhs similars dins lors retrospectivas d'aisinas intèrnas. Lo modèl DAG significa tanben que BuildKit pòt generar de metadonadas de construccion fòrça precisas — una basa per de foncionalitats coma las atestacions de provenéncia e la generacion de factura de materials de logicials (SBOM) qu'importan enòrmament per la seguretat de la cadena d'avitalhament.

I a tanben un cambiament conceptual dins la manièra de foncionar de l'invalidacion del cache. Lo constructor classic invalidèt cada calc en dejós de tota instruccion modificada. BuildKit seguís los hashes de contengut a cada entrada, aital cambiar un comentari dins un fichièr Docker bufa pas una dintrada de cache que representa trenta minutas de compilacion. Quand vòstre cache de construccion es la diferéncia entre un bucle de retroaccion de cinc minutas e una de quaranta minutas per vòstra còla d'engenharia, aquesta precision importa fòrça mai que çò que poiriá semblar d'en primièr.

Construccions multiplataforma: una comanda, cada arquitectura

La bandièra --platform de BuildKit e l'integracion QEMU transforman çò qu'èra un còp un problèma de coordinacion multisistèma dolorós en una sola comanda. L'execucion de docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 . produtz tres imatges prèstes a la produccion en parallèl a partir d'una sola invocacion de construccion. Aquesta capacitat es venguda critica a mesura que l'industria se desplaça cap a ARM — las instàncias AWS Graviton3 ofrisson de manièra consistente una performància de prètz de 40% melhora sus de cargas de trabalh coma lo servici web e lo tractament de donadas, e Apple Silicon a fach d'ARM la maquina de desvolopament per defaut per de milions d'engenhaires.

Abans que lo supòrt multiplataforma de BuildKit madurèsse, lo manten de pipelines de construccion separats per d'arquitecturas diferentas èra un vertadièr centre de còst. Las còlas siá mantenián de fichièrs Docker multiples, executavan de pipelines CI separats sus de corredors d'arquitecturas diferentas, siá simplament envièron d'imatges x86 pertot e pagèron la penalitat de performància sus l'infrastructura ARM. Amb BuildKit, definissètz vòstra construccion un còp e daissatz lo sistèma gerir la compilacion especifica a l'arquitectura de manièra transparenta. De projèctes Rust que demandan una compilacion crosada, de projèctes Go amb de dependéncias CGO, de paquets Python amb d'extensions C — BuildKit gerís lo calc d'emulacion sens vos demandar de comprene los detalhs de cada plataforma cibla.

La valor comerciala practica aicí es mesurabla. Una còla qu'executa 200 contenedors sus d'instàncias AWS Graviton a 0,04 $ per ora-vCPU contra l'instància x86 equivalenta a 0,056 $ per ora-vCPU estalvia aperaquí 11 520 $ annalament per 100 vCPU — purament en causissent la bona arquitectura. Rendre aquela causida accessibla sens un esfòrç de re-engenharia es exactament lo tipe d'optimizacion de l'infrastructura que se paga immediatament.

Gestion secreta sens filtrar dins de calques d'imatge

Una de las foncionalitats mai sospreciadas de BuildKit es son API de secrets. Lo constructor Docker classic aviá pas cap de biais net de passar las credencialas dins una version sens qu'aquelas credencialas acabèsson potencialament dins un calc d'imatge. Los desvolopaires trabalhèron a l'entorn d'aquò amb de versions multi-estapas, d'instruccions ARG, e d'òrdre atentiu — mas lo risc d'entraïnar accidentalament una clau API o una clau SSH privada dins un imatge expediat demorèt malcomodament naut. Los escanèrs de seguretat tròban rutinariament de credencialas hardcoded dins d'imatges de contenedors publicats dins de registres publics, e fòrça d'aquelas filtracions remontan dirèctament a una gestion de secret maladrech pendent las construccions.

La bandièra --secret de BuildKit monta de donadas sensiblas dins l'environament de construccion coma un camin de sistèma de fichièrs temporari qu'existís pas que per la durada de l'instruccion RUN especifica que n'a de besonh e tòca pas jamai cap de calc d'imatge. Una instruccion Dockerfile coma RUN --mount=type=secret,id=npmrc cat /run/secrets/npmrc > ~/.npmrc && npm install dona al procès de construccion l'accès a las credencialas npm privadas sens qu'aquelas credencialas apareguèsson jamai dins l'imatge final o dins quin calc que siá intermediari. Lo meteis modèl fonciona per las credencials PyPI, los paramètres Maven, las claus SSH pels depauses Git privats, e tot autre material sensible que vòstre processus de construccion necessita.

Per las equipas que bastisson de logicials que tòcan las industrias reguladas — plataformas de santat, produches fintech, logicials de RH — la diferéncia entre "las credencials poirián èsser dins l'imatge" e "las credencials pòdon pas èsser probablament dins l'imatge" es la diferéncia entre passar una auditoria de seguretat e passar tres setmanas a remediar las descobèrtas. De plataformas coma Mewayz, qu'alimentan las operacions comercialas per mai de 138 000 utilizaires dins d'industrias coma la nòmina, las RH e la facturacion, dependon exactament d'aquel tipe de postura de seguretat provabla dins lors pipelines de construccion e de desplegament per manténer la confiéncia qu'aqueles clients expandisson a lors donadas financièras e personalas sensiblas.

Exportacions de cache: far rapidament los pipelines CI

Los pipelines CI son ont la performància de construccion compta mai e ont l'experiéncia de construccion Docker per defaut es estada istoricament la mai dolorosa. Los corredors CI novèls començan tipicament amb de caches vuèges, çò que significa que cada execucion de pipeline recompila tot de zéro. Per un servici Java amb de centenats de dependéncias Maven, un projècte Rust, o una aplicacion Python amb d'extensions nativas pesugas, aquò significa de temps de construccion mesurats en desenats de minutas puslèu qu'en segondas. Lo còst comercial de l'IC lent es enòrme — una frequéncia de desplegament redusida, de bucles de retroaccion mai longs, e d'engenhaires assetats inactius en esperant que los pipelines se completen abans que pòscan fusionar e contunhar.

La foncionalitat d'exportacion de cache de BuildKit resòlv aquò amb de manifèstes de cache exportables. En utilizant --cache-to type=registry,ref=myregistry/myapp:cache e --cache-from type=registry,ref=myregistry/myapp:cache, BuildKit bota un instantanèu de cache detalhat dins un registre après cada build e lo tira al començament seguent. L'escobilhièr es adreçat al contengut, doncas sonque los calques vertadièrament cambiats son recuperats. Las còlas qu'utilizan aqueste modèl dins GitHub Actions, GitLab CI, e CircleCI talhan de manièra rutinaria los temps de pipeline de quinze minutas a mens de tres dins las execucions seguentas. La pròpria documentacion de GitHub suls fluxes de trabalh de construccion avançats de Docker recomanda fòrtament aqueste modèl per exactament aquela rason.

La compilacion mai rapida es la que cal pas jamai tornar executar. Lo sistèma de cache en jaces e adreçat al contengut de BuildKit accelera pas sonque las compilacions — rend lo concèpte entièr d'una "construccion" mai intelligent, en transformant una compilacion repetida en un diferéncia incrementala de çò que cambièt exactament.

Las exportacions de cache s'integran tanben netament amb los fluxes de trabalh de desvolopament basats sus de brancas. Podètz configurar vòstre pipeline CI per tornar d'un cache especific a la branca cap a l'escondedor de branca principala quand cap de cache de branca existís pas, çò que significa que las novèlas brancas benefician immediatament de l'escobilhièr caud acumulat per vòstra linha de desvolopament principala. Los engenhaires recebon de retroaccions rapidas dempuèi lor primièr engatjament sus una novèla branca puslèu qu'esperar una penalitat de començament a freg.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

BuildKit Frontends: Building Beyond Dockerfiles

Benlèu la capacitat mens coneguda de BuildKit es que los Dockerfiles son pas qu'un format d'entrada possible — pas lo sol. BuildKit a una arquitectura frontend pluggable que permet de lengas e de formats de definicion de construccion entièrament personalizats. Lo frontend es especificat per la directiva # syntax= en naut de vòstre fichièr de construccion, que ditz a BuildKit de tirar un imatge frontend particular e de l'utilizar per analisar e executar lo rèsta del fichièr.

Aquesta arquitectura a permés divèrses projèctes convincents. L'integracion de Buildpacks permet a BuildKit de bastir d'imatges de contenedors a partir de còde font d'aplicacion sens cap de fichièr Docker — detecta lo lengatge, causís d'imatges de basa apropriats, e assembla automaticament un contenedor prèst a la produccion. HPC e las comunautats d'informatica scientifica an utilizat de frontends personalizats per descriure de versions dins de lengas especificas al domeni que se compilan fins a la representacion intèrna LLB (Low-Level Build) de BuildKit. Lo frontend de sintaxi docker/dockerfile:labs experimenta amb de foncionalitats coma lo supòrt heredoc, lo contraròtle --ret per instruccion, e d'entresenhas de cache melhoradas abans qu'aterrisson dins la sintaxi Dockerfile establa.

La possibilitat de definir vòstre pròpri frontend significa tanben que las organizacions amb de requisits de construccion insolits an pas de causir entre "shoehorn tot dins la sintaxi Dockerfile" e "abandonar entièrament los contenedors." Un micrologicial FPGA de construccion d'equipa, d'imatges de sistèmas encastrats, o de contenedors de modèls ML especializats pòdon descriure lor construccion en tèrmes que fan sens per lor domeni del temps que produson d'imatges de contenedors estandard conformes a OCI que se desplegan ont que siá los contenedors foncionats. Aquesta extensibilitat es un vertadièr avantatge arquitectural suls sistèmas de construccion que tractan lor format d'entrada coma fixe.

Provenéncia e SBOM: Bastiment pel Mond Post-SolarWinds

La seguretat de la cadena d'avitalhament de logicials passèt de la preocupacion teorica a la prioritat al nivèl del conselh après la violacion de SolarWinds en 2020 e la vulnerabilitat de Log4Shell en 2021. L'òrdre executiu 14028 del govèrn dels Estats Units sus la cibersecuritat, emesa en mai de 2021, mandava lo projècte de lei de logicials pels contractistes federals. Las atestacions de provenéncia e las foncionalitats de generacion de SBOM de BuildKit son una responsa dirècta a aqueste païsatge regulatòri e de seguretat.

Amb los senhals --provenance=true e --sbom=true, BuildKit genera d'atestacions signadas criptograficament que descrivon exactament çò qu'es dintrat dins un imatge de contenedor — quines imatges de basa foguèron utilizats, quinas instruccions Dockerfile executadas, quines fichièrs font èran presents, quinas dependéncias extèrnas foguèron presas. Aquestas atestacions seguisson l'encastre SLSA (Nivèls de cadena d'avitalhament per d'artefactes de logicials) e lo format d'atestacion in-toto, çò que los rend verificables per maquina per de motors de politicas coma Cosign de Sigstore e OPA (Open Policy Agent).

Lo flux de trabalh practic qu'aquò permet sembla a aquò :

  1. Lo desvolopaire emponta lo còde; Lo pipeline CI desencadena una construccion de BuildKit amb la provenéncia activada.
  2. BuildKit genèra un SBOM signat listant totes los compausants e lors versions.
  3. Lo SBOM es publicat dins lo registre de contenedors al costat del manifèst d'imatge.
  4. Los contrarotlaires d'admission dins lo cluster Kubernetes verifican la provenéncia abans d'autorizar lo desplegament.
  5. Los escanèrs de vulnerabilitat interrogan lo SBOM per identificar los imatges afectats quand de novèls CVE son revelats.

Las còlas qu'implementan aqueste pipeline complet pòdon respondre a las divulgacions de vulnerabilitats en d'oras puslèu que de jorns, perque an una mapa precisa e legibla per maquina de cada compausant dins cada contenedor en cors. Per d'entrepresas coma Mewayz que s'intègran prigondament dins los fluxes de trabalh operacionals dels clients — gerir la nòmina, gerir de donadas de flòta, tractar de facturas — la capacitat de demostrar una cadena d'avitalhament rigorosa e auditabla es de mai en mai un prerequisit per las convèrsas de vendas d'entrepresa, pas sonque un polit d'aver.

Començar: De las construccions per defaut a las pipelines avançadas

BuildKit es ja en cors d'execucion dins vòstre environament Docker se utilizatz una version recenta — Docker 23.0 e l'activatz mai tard per defaut. La primièra etapa practica per la màger part de las equipas es d'activar l'ensamblador Docker Buildx, qu'expausa l'ensemble complet de foncionalitats de BuildKit a travèrs la soscomanda docker buildx. L'execucion de docker buildx create --use configura una instància de constructor de BuildKit amb mai de capacitat que lo pilòt per defaut. A partir d'aquí, l'adopcion incrementala de foncionalitats avançadas a de sens puslèu qu'ensajar d'adoptar tot d'un còp.

Un camin d'adopcion rasonable per una còla que fa actualament d'invocacions docker build de basa sembla d'apondre d'en primièr d'exportacions de cache a CI — aquò provesís de melhoraments de velocitat immediats e mesurables amb un cambiament de configuracion minimal. Las construccions multiplataforma venon preciosas quand l'equipa comença de ciblar l'infrastructura ARM. Lo montatge secret val la pena d'adoptar cada còp que los registres de paquets privats o las claus SSH apareisson dins lo contèxte de construccion. Las atestacions de provenéncia an de sens per permetre quand los requisits de conformitat o las demandas dels clients d'entrepresa fan la documentacion de la cadena d'avitalhament necessària.

La leiçon mai prigonda de BuildKit es a prepaus de bastir deliberadament. Que siáu enviant un contenedor per un microservici, un punt final d'inferéncia d'aprendissatge automatic, o una plataforma complèxa coma la suite de 207 moduls de negòci de Mewayz, lo procès de construccion es pas una formalitat que precipitatz sul camin cap al desplegament — es un artefacte d'engenharia que rebat la qualitat, la postura de seguretat e la maduretat operacionala de tot çò qu'expediguèt. BuildKit vos dona las aisinas per far aquel artefacte excellent. La question es simplament se prenètz lo temps de los utilizar.

Questions frequentas

Qu'es BuildKit e cossí es diferent del sistèma de construccion classic Docker?

BuildKit es lo motor de construccion de generacion seguenta de Docker, introduch dins Docker 18.09 e fach per defaut dins Docker 23.0. A la diferéncia del constructor classic, BuildKit pren en carga l'execucion de calc parallèl, d'estrategias de cache avançadas, lo montatge de secrets e las construccions multiplataformas. Tracta lo procès de construccion coma un grafic aciclic dirigit (DAG), permetent una resolucion de dependéncia mai intelligenta e de temps de construccion dramaticament mai rapids per de fichièrs Docker complèxes e multiestadi.

Ai besonh d'installar quicòm de mai per començar a utilizar BuildKit amb Docker ?

Cap d'installacion suplementària es pas necessària se executatz Docker 23.0 o ulterior — BuildKit es activat per defaut. Dins las versions mai ancianas, lo podètz activar en definissent la variabla d'environament DOCKER_BUILDKIT=1 abans d'executar vòstras comandas de construccion. Per de cases d'utilizacion avançats coma de caches de compilacion a distància o de compilacions multiplataforma, podètz voler configurar una instància de buildx Buildx dedicada en utilizant docker buildx create.

BuildKit pòt èsser utilizat per bastir d'artefactes al delà dels imatges de contenedors estandard ?

Òc, e aquò's una de las capacitats mai subrevalorizadas de BuildKit. En utilizant de frontends personalizats e lo senhal --output, BuildKit pòt produire de binaris bruts, de tarballs, de sites web estatics, e d'autres artefactes de fichièrs arbitraris — pas sonque d'imatges OCI. Aquò ne fa un motor de construccion d'usatge general que s'inscriu naturalament dins de monorepos poliglòtas e de pipelines CI complèxes ont d'equipas diferentas an de besonh de formats de sortida diferents d'una cadena d'aisinas unificada.

Cossí BuildKit s'inscriu dins una plataforma DevOps mai larga amb d'aisinas coma Mewayz?

BuildKit gestiona lo calc de construccion de bas nivèl, mas las còlas de desvolopament modèrnas an tanben besonh de gerir los fluxes de trabalh de las entrepresas, la liurason dels clients e los processus operacionals. De plataformas coma Mewayz — un SO de 207 moduls a partir de 19 $/mo — complementan l'aisina d'infrastructura en cobrissent lo costat operacional de las entrepresas de logicials. L'acoblament de pipelines de construccion eficients alimentats per BuildKit amb una plataforma tot en un coma Mewayz dona a las còlas una pila completa de l'artefacte de còde a la liurason del client.