Hacker News

BuildKit: Dockers skjulte perle som kan bygge nesten hva som helst

Kommentarer

13 min read Via tuananh.net

Mewayz Team

Editorial Team

Hacker News

BuildKit: Dockers skjulte perle som kan bygge nesten hva som helst

De fleste utviklere kjenner Docker som containerkjøringen som endret hvordan programvaren ble sendt. Langt færre vet om motoren som brummer stille under overflaten til alle moderne Docker-bygg – BuildKit, neste generasjons byggesystem som har blitt levert med Docker siden versjon 18.09 og ble standard backend i Docker 23.0. Mens ingeniører krangler i det uendelige om Kubernetes-konfigurasjoner og mikrotjenestemønstre, har BuildKit stadig utviklet seg til et av de kraftigste, fleksible byggesystemene i DevOps-økosystemet. Hvis du har behandlet det som bare en raskere dockerbygging, etterlater du enorm kapasitet på bordet. Selskaper som kjører høykapasitets CI/CD-rørledninger har kuttet byggetiden med 50–70 % ganske enkelt ved å forstå hva BuildKit faktisk tilbyr – og det er bare begynnelsen.

Hva gjør BuildKit fundamentalt forskjellig fra den klassiske Builder

Den originale Docker-byggmotoren utførte Dockerfile-instruksjoner sekvensielt, ett lag om gangen, uten bevissthet om hvilket arbeid som trygt kunne skje parallelt. BuildKit erstatter den lineære utførelsesmodellen med en rettet asyklisk graf (DAG) – en avhengighetsgraf som forstår hvilke byggetrinn som er avhengige av hverandre og hvilke som ikke gjør det. Uavhengige stadier utføres samtidig, ubrukte stadier hoppes helt over, og hele bygget blir en deklarativ beskrivelse av hva du ønsker i stedet for en imperativ sekvens av trinn du må resitere i riktig rekkefølge.

Dette arkitektoniske skiftet har praktiske konsekvenser som går utover hastighet. Når en flertrinns Dockerfile kompilerer en Go-binær i ett trinn, laster ned Node.js-avhengigheter i et annet og setter sammen et produksjonsbilde i et tredje, kan BuildKit kjøre de to første trinnene samtidig. Et bygg som tidligere tok fire minutter på en kraftig CI-løper, fullføres nå på under nitti sekunder. Stripe, Shopify og mange andre høyskala ingeniørteam har dokumentert lignende gevinster i sine interne verktøyretrospektiver. DAG-modellen betyr også at BuildKit kan generere svært nøyaktige byggemetadata – et grunnlag for funksjoner som herkomstattester og generering av programvarestyklister (SBOM) som har enorm betydning for sikkerheten i forsyningskjeden.

Det er også et konseptuelt skifte i hvordan cache-uvalidering fungerer. Den klassiske byggherren ugyldiggjorde hvert lag under enhver endret instruksjon. BuildKit sporer innholds-hasher ved hver inngang, så å endre en kommentar i en Dockerfile blåser ikke bort en cache-oppføring som representerer tretti minutters kompilering. Når byggebufferen din er forskjellen mellom en fem-minutters og en førti-minutters tilbakemeldingssløyfe for ingeniørteamet ditt, betyr denne presisjonen mye mer enn det i utgangspunktet kan virke.

Multi-plattformbygg: én kommando, hver arkitektur

BuildKits --plattform-flagg og QEMU-integrasjon forvandler det som en gang var et smertefullt multisystemkoordineringsproblem til en enkelt kommando. Å kjøre docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 . produserer tre produksjonsklare bilder parallelt fra en enkelt byggeanrop. Denne evnen har blitt kritisk etter hvert som industrien skifter mot ARM – AWS Graviton3-forekomster leverer konsekvent 40 % bedre prisytelse på arbeidsbelastninger som webservering og databehandling, og Apple Silicon har gjort ARM til standard utviklingsmaskin for millioner av ingeniører.

Før BuildKits multiplattformstøtte modnet, var det å opprettholde separate byggerørledninger for forskjellige arkitekturer et reelt kostnadssenter. Lagene opprettholdt enten flere Dockerfiler, kjørte separate CI-rørledninger på løpere med forskjellig arkitektur, eller rett og slett sendte x86-bilder overalt og betalte ytelsesstraffen på ARM-infrastruktur. Med BuildKit definerer du bygget én gang og lar systemet håndtere arkitekturspesifikk kompilering på en transparent måte. Rustprosjekter som krever krysskompilering, Go-prosjekter med CGO-avhengigheter, Python-pakker med C-utvidelser – BuildKit håndterer emuleringslaget uten at du trenger å forstå detaljene for hver målplattform.

Den praktiske forretningsverdien her er målbar. Et team som kjører 200 containere på AWS Graviton-forekomster til $0,04 per vCPU-time mot den tilsvarende x86-forekomsten til $0,056 per vCPU-time sparer omtrent $11 520 årlig per 100 vCPU-er - rent fra å velge riktig arkitektur. Å gjøre dette valget tilgjengelig uten omarbeid er akkurat den typen infrastrukturoptimalisering som betaler seg umiddelbart.

Hemmelig administrasjon uten å lekke inn i bildelag

En av de mest undervurderte BuildKit-funksjonene er Secrets API. Den klassiske Docker-byggeren hadde ingen ren måte å overføre legitimasjon til en build uten at legitimasjonen potensielt havnet i et bildelag. Utviklere jobbet rundt dette med flertrinnsbygg, ARG-instruksjoner og nøye bestilling - men risikoen for å bake inn en API-nøkkel eller privat SSH-nøkkel i et sendt bilde var fortsatt ubehagelig høy. Sikkerhetsskannere finner rutinemessig hardkodet legitimasjon i beholderbilder publisert til offentlige registre, og mange av disse lekkasjene spores direkte tilbake til klønete hemmelig håndtering under bygg.

BuildKits --secret-flagg monterer sensitive data i byggemiljøet som en midlertidig filsystembane som kun eksisterer under varigheten av den spesifikke RUN-instruksjonen som trenger det, og som aldri berører noe bildelag. En Dockerfile-instruksjon som RUN --mount=type=secret,id=npmrc cat /run/secrets/npmrc > ~/.npmrc && npm install gir byggeprosessen tilgang til privat npm-legitimasjon uten at denne legitimasjonen noen gang vises i det endelige bildet eller noe mellomlag. Det samme mønsteret fungerer for PyPI-legitimasjon, Maven-innstillinger, SSH-nøkler for private Git-depoter og alt annet sensitivt materiale byggeprosessen krever.

For team som bygger programvare som berører regulerte bransjer – helseplattformer, fintech-produkter, HR-programvare – er forskjellen mellom "legitimasjon kan være med i bildet" og "legitimasjon kan beviselig ikke være med i bildet" forskjellen mellom å bestå en sikkerhetsrevisjon og å bruke tre uker på å utbedre funn. Plattformer som Mewayz, som driver forretningsdrift for over 138 000 brukere på tvers av bransjer som lønn, HR og fakturering, er avhengige av akkurat denne typen påviselig sikkerhetsstilling i bygge- og distribusjonspipelines for å opprettholde tilliten disse kundene har til sine sensitive økonomiske og personelldata.

Cacheeksport: Gjør CI-rørledninger faktisk raske

CI-pipelines er der byggeytelsen betyr mest og der standard Docker-byggeopplevelsen historisk sett har vært mest smertefull. Friske CI-løpere starter vanligvis med tomme cacher, noe som betyr at hver pipeline-kjøring rekompilerer alt fra bunnen av. For en Java-tjeneste med hundrevis av Maven-avhengigheter, et Rust-prosjekt eller en Python-applikasjon med tunge native utvidelser, betyr dette byggetider målt i titalls minutter i stedet for sekunder. Forretningskostnadene for langsom CI er enorme – redusert distribusjonsfrekvens, lengre tilbakemeldingssløyfer og ingeniører som sitter inaktive og venter på at rørledningene skal fullføres før de kan slå seg sammen og gå videre.

BuildKits buffereksportfunksjon løser dette med eksporterbare cache-manifester. Ved å bruke --cache-to type=registry,ref=myregistry/myapp:cache og --cache-from type=registry,ref=myregistry/myapp:cache, skyver BuildKit et detaljert hurtigbuffer-øyeblikksbilde til et register etter hver build og henter det ved starten av neste. Bufferen er innholdsadressert, så bare reelt endrede lag blir hentet på nytt. Lag som bruker dette mønsteret i GitHub Actions, GitLab CI og CircleCI, kutter rutinemessig pipeline-tider fra femten minutter til under tre ved påfølgende kjøringer. GitHubs egen dokumentasjon om avanserte Docker-arbeidsflyter anbefaler sterkt dette mønsteret av akkurat denne grunnen.

Den raskeste byggingen er den du aldri trenger å kjøre igjen. BuildKits lagdelte, innholdsadresserte hurtigbuffersystem øker ikke bare byggingen raskere – det gjør hele konseptet med en "build" smartere, og gjør en gjentatt kompilering til en inkrementell forskjell av nøyaktig hva som endret seg.

Cacheeksport integreres også rent med grenbaserte utviklingsarbeidsflyter. Du kan konfigurere CI-rørledningen til å falle tilbake fra en grenspesifikk cache til hovedgrencachen når ingen grencache eksisterer, noe som betyr at nye grener umiddelbart drar nytte av den varme cachen akkumulert av hovedutviklingslinjen. Ingeniører får rask tilbakemelding fra deres aller første forpliktelse på en ny gren i stedet for å vente på en kaldstartstraff.

💡 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-grensesnitt: Building Beyond Dockerfiles

Den kanskje minst kjente egenskapen til BuildKit er at Dockerfiler bare er ett mulig inndataformat – ikke det eneste. BuildKit har en pluggbar frontend-arkitektur som tillater helt tilpassede byggedefinisjonsspråk og formater. Grensesnittet er spesifisert av # syntax=-direktivet øverst i byggefilen, som forteller BuildKit å trekke et bestemt grensesnittbilde og bruke det til å analysere og kjøre resten av filen.

Denne arkitekturen har muliggjort flere overbevisende prosjekter. Buildpacks-integrasjon lar BuildKit bygge containerbilder fra applikasjonens kildekode uten noen Dockerfile i det hele tatt - den oppdager språket, velger passende basisbilder og setter sammen en produksjonsklar container automatisk. HPC og vitenskapelige datamiljøer har brukt tilpassede grensesnitt for å beskrive bygg i domenespesifikke språk som kompileres ned til BuildKits interne LLB-representasjon (Low-Level Build). docker/dockerple:labs-syntaks-frontend-eksperimentene med funksjoner som heredoc-støtte, --nettverk-kontroll per instruksjon og forbedrede cache-hint før de lander i stabil Dockerfile-syntaks.

Muligheten til å definere din egen frontend betyr også at organisasjoner med uvanlige byggekrav ikke trenger å velge mellom "skohorn alt inn i Dockerfile-syntaks" og "forlate containere helt." Et teambyggende FPGA-fastvare, innebygde systembilder eller spesialiserte ML-modellbeholdere kan beskrive konstruksjonen deres i termer som gir mening for domenet deres, samtidig som de produserer standard OCI-kompatible beholderbilder som distribuerer hvor som helst containere kjører. Denne utvidbarheten er en genuin arkitektonisk fordel i forhold til byggesystemer som behandler inndataformatet som fast.

Provenance og SBOM: Building for the Post-SolarWinds World

Sikkerhet for programvareforsyningskjeden flyttet fra teoretisk bekymring til prioritet på styrenivå etter SolarWinds-bruddet i 2020 og Log4Shell-sårbarheten i 2021. Den amerikanske regjeringens Executive Order 14028 om cybersikkerhet, utstedt i mai 2021, ga mandat til programvarekontrakter for føderale leverandører. BuildKits herkomstattester og SBOM-genereringsfunksjoner er et direkte svar på dette regulatoriske og sikkerhetsmessige landskapet.

Med --provenance=true og --sbom=true-flagg, genererer BuildKit kryptografisk signerte attester som beskriver nøyaktig hva som gikk inn i et containerbilde – hvilke basisbilder som ble brukt, hvilke Dockerfile-instruksjoner som ble utført, hvilke kildefiler som var til stede og hvilke eksterne avhengigheter som ble hentet. Disse attestasjonene følger SLSA-rammeverket (Supply-chain Levels for Software Artifacts) og in-toto-attestasjonsformatet, noe som gjør dem maskinverifiserbare av policymotorer som Sigstores Cosign og OPA (Open Policy Agent).

Den praktiske arbeidsflyten dette muliggjør ser slik ut:

  1. Utvikler sender kode; CI-pipeline utløser et BuildKit-bygg med herkomst aktivert.
  2. BuildKit genererer en signert SBOM som viser alle komponenter og deres versjoner.
  3. SBOM publiseres til beholderregisteret ved siden av bildemanifestet.
  4. Opptakskontrollører i Kubernetes-klyngen bekrefter herkomst før de tillater distribusjon.
  5. Sårbarhetsskannere spør SBOM for å identifisere berørte bilder når nye CVE-er avsløres.

Team som implementerer denne fullstendige pipelinen kan svare på avsløringer av sårbarheter i løpet av timer i stedet for dager, fordi de har et presist, maskinlesbart kart over hver komponent i hver kjørende container. For bedrifter som Mewayz som integreres dypt i kundenes operasjonelle arbeidsflyter – kjøre lønn, administrere flåtedata, behandle fakturaer – er evnen til å demonstrere en streng, reviderbar forsyningskjede i økende grad en forutsetning for bedriftssalgssamtaler, ikke bare en hyggelig å ha.

Kom i gang: Fra standardbygg til avanserte rørledninger

BuildKit kjører allerede i Docker-miljøet ditt hvis du bruker en nyere versjon – Docker 23.0 og nyere aktiverer det som standard. Det første praktiske trinnet for de fleste team er å aktivere Docker Buildx-plugin, som viser BuildKits fulle funksjonssett gjennom underkommandoen docker buildx. Å kjøre docker buildx create --use setter opp en BuildKit-byggerforekomst med flere muligheter enn standarddriveren. Derfra gir inkrementell bruk av avanserte funksjoner mening i stedet for å prøve å ta i bruk alt på en gang.

En rimelig adopsjonsvei for et team som for tiden utfører grunnleggende docker build-påkallelser ser ut som å legge til hurtigbuffereksport til CI først – dette gir umiddelbare, målbare hastighetsforbedringer med minimal konfigurasjonsendringer. Bygger med flere plattformer blir verdifulle når teamet begynner å målrette ARM-infrastruktur. Hemmelig montering er verdt å ta i bruk hver gang private pakkeregistre eller SSH-nøkler vises i byggesammenheng. Herkomstattester er fornuftige for å aktivere når samsvarskrav eller bedriftskundekrav gjør forsyningskjededokumentasjon nødvendig.

Den dypere leksjonen til BuildKit handler om å bygge bevisst. Enten du sender en container for en mikrotjeneste, et endepunkt for maskinlæringsslutning eller en kompleks plattform som Mewayz sin pakke med 207 forretningsmoduler, er ikke byggeprosessen en formalitet du skynder deg gjennom på veien til distribusjon – det er en ingeniørartefakt som gjenspeiler kvaliteten, sikkerhetsstillingen og driftsmodenheten til alt som sendes ut av den. BuildKit gir deg verktøyene for å gjøre den artefakten utmerket. Spørsmålet er bare om du tar deg tid til å bruke dem.

Ofte stilte spørsmål

Hva er BuildKit og hvordan er det forskjellig fra det klassiske Docker-byggesystemet?

BuildKit er Dockers neste generasjons byggemotor, introdusert i Docker 18.09 og som standard i Docker 23.0. I motsetning til den klassiske byggeren, støtter BuildKit kjøring av parallelle lag, avanserte cachingstrategier, hemmeligheter og bygg på tvers av plattformer. Den behandler byggeprosessen som en rettet asyklisk graf (DAG), som muliggjør smartere avhengighetsoppløsning og dramatisk raskere byggetider for komplekse, flertrinns dockerfiler.

Trenger jeg å installere noe ekstra for å begynne å bruke BuildKit med Docker?

Ingen ekstra installasjon er nødvendig hvis du kjører Docker 23.0 eller nyere – BuildKit er aktivert som standard. På eldre versjoner kan du aktivere den ved å sette miljøvariabelen DOCKER_BUILDKIT=1 før du kjører byggekommandoer. For avanserte brukstilfeller som eksterne byggebuffere eller flerplattformsbygg, kan det være lurt å konfigurere en dedikert Buildx-byggerforekomst ved å bruke docker buildx create.

Kan BuildKit brukes til å bygge artefakter utover standard containerbilder?

Ja, og dette er en av BuildKits mest undervurderte funksjoner. Ved å bruke tilpassede grensesnitt og --output-flagget, kan BuildKit produsere rå binære filer, tarballs, statiske nettsteder og andre vilkårlige filartefakter – ikke bare OCI-bilder. Dette gjør den til en generell byggemotor som passer naturlig inn i polyglot monorepos og komplekse CI-rørledninger der forskjellige team trenger forskjellige utdataformater fra en enhetlig verktøykjede.

Hvordan passer BuildKit inn i en bredere DevOps-plattform sammen med verktøy som Mewayz?

BuildKit håndterer byggelaget på lavt nivå, men moderne utviklingsteam må også administrere forretningsflyter, kundelevering og driftsprosesser. Plattformer som Mewayz – et 207-modulers forretningsoperativsystem som starter på $19/md – kompletterer infrastrukturverktøy ved å dekke den operasjonelle siden av programvarebedrifter. Sammenkobling av effektive byggepipelines drevet av BuildKit med en alt-i-ett-plattform som Mewayz gir teamene en komplett stabel fra kodeartefakt til kundelevering.