Hacker News

BuildKit: Ang Nakatago nga Mutya sa Docker nga Mahimong Makatukod Halos Bisan Unsa

Mga komento

18 min read Via tuananh.net

Mewayz Team

Editorial Team

Hacker News

BuildKit: Ang Tinago nga Mutya sa Docker Nga Mahimong Makatukod Halos Bisan Unsa

Kadaghanan sa mga developer nakaila sa Docker isip container runtime nga nagbag-o kung giunsa pagpadala ang software. Diyutay ra ang nahibal-an bahin sa makina nga hilom nga nag-hum sa ilawom sa nawong sa matag modernong Docker build - BuildKit, ang sunod nga henerasyon nga sistema sa pagtukod nga gipadala kauban ang Docker sukad sa bersyon 18.09 ug nahimo nga default backend sa Docker 23.0. Samtang ang mga inhenyero walay hunong nga nakiglantugi bahin sa mga kumpigurasyon sa Kubernetes ug mga sumbanan sa microservice, ang BuildKit padayon nga nag-uswag sa usa sa labing kusgan, nabag-o nga sistema sa pagtukod sa ekosistema sa DevOps. Kung gitratar nimo kini nga usa ka mas paspas nga pagtukod sa pantalan, nagbilin ka daghang katakus sa lamesa. Ang mga kompanya nga nagpadagan ug high-throughput nga CI/CD pipelines mipamutol sa mga oras sa pagtukod og 50–70% pinaagi lang sa pagsabot kon unsa ang tinuod nga gitanyag sa BuildKit — ug mao pa lang kini ang sinugdanan.

Unsa ang Nakapahimo sa BuildKit nga Puno nga Lahi Gikan sa Klasikong Magtutukod

Ang orihinal nga Docker build engine nagpatuman sa mga instruksiyon sa Dockerfile nga sunud-sunod, usa ka layer sa usa ka higayon, nga walay kahibalo kung unsa nga trabaho ang luwas nga mahitabo nga managsama. Gipulihan sa BuildKit kanang linear execution nga modelo sa usa ka directed acyclic graph (DAG) — usa ka dependency graph nga nakasabut kung unsang mga lakang sa pagtukod ang nagsalig sa usag usa ug dili. Ang mga independyente nga mga yugto dungan nga gipatuman, ang wala magamit nga mga yugto hingpit nga gilaktawan, ug ang tibuuk nga pagtukod mahimong usa ka deklaratibo nga paghulagway kung unsa ang imong gusto kaysa usa ka kinahanglan nga pagkasunod-sunod sa mga lakang nga kinahanglan nimo nga i-recite sa husto nga pagkasunod-sunod.

Kini nga pagbalhin sa arkitektura adunay praktikal nga mga sangputanan nga labaw pa sa katulin. Kung ang usa ka multi-stage nga Dockerfile nag-compile sa usa ka Go binary sa usa ka yugto, nag-download sa mga dependency sa Node.js sa lain, ug nag-assemble sa usa ka imahe sa produksiyon sa usa ka ikatulo, ang BuildKit makadagan sa una nga duha ka yugto nga dungan. Ang usa ka pagtukod nga kaniadto upat ka minuto sa usa ka kusgan nga runner sa CI karon nahuman sa ubos sa kasiyaman ka segundo. Ang Stripe, Shopify, ug daghang uban pang mga high-scale nga mga team sa engineering nakadokumento sa parehas nga mga kadaugan sa ilang internal nga mga retrospective sa tool. Ang modelo sa DAG nagpasabot usab nga ang BuildKit makamugna og tukma kaayong build metadata — usa ka pundasyon sa mga feature sama sa provenance attestations ug software bill of materials (SBOM) generation nga importante kaayo sa supply chain security.

Adunay usab usa ka konsepto nga pagbag-o kung giunsa ang pag-invalid sa cache. Gi-invalidate sa classic builder ang matag layer ubos sa bisan unsang giusab nga instruksiyon. Gisubay sa BuildKit ang mga hash sa sulud sa matag input, mao nga ang pagbag-o sa usa ka komentaryo sa usa ka Dockerfile dili makapahawa sa usa ka entry sa cache nga nagrepresentar sa katloan ka minuto nga pagtipon. Kung ang imong build cache mao ang kalainan tali sa lima ka minuto ug kwarenta ka minuto nga feedback loop para sa imong engineering team, kini nga katukma mas importante pa kaysa sa una.

Multi-Platform nga Pagtukod: Usa ka Sugo, Matag Arkitektura

BuildKit's --platform flag ug QEMU integration nagbag-o sa kaniadto usa ka sakit nga multi-system coordination nga problema ngadto sa usa ka command. Ang pagpadagan docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 . nagpatunghag tulo ka production-ready nga mga hulagway nga magkaparehas gikan sa usa ka build invocation. Kini nga kapabilidad nahimong kritikal samtang ang industriya mibalhin ngadto sa ARM — ang AWS Graviton3 nga mga instances makanunayon nga naghatag ug 40% nga mas maayong presyo-performance sa mga workloads sama sa web serving ug data processing, ug ang Apple Silicon naghimo sa ARM nga default development machine alang sa minilyon nga mga engineer.

Sa wala pa mohamtong ang suporta sa multi-platform sa BuildKit, ang pagmintinar sa bulag nga mga pipeline sa pagtukod alang sa lain-laing mga arkitektura usa ka tinuod nga sentro sa gasto. Ang mga koponan nagmentinar sa daghang Dockerfiles, nagpadagan sa bulag nga mga pipeline sa CI sa lahi nga arkitekto nga mga runner, o nagpadala lang sa mga x86 nga imahe bisan diin ug gibayran ang silot sa pasundayag sa imprastraktura sa ARM. Uban sa BuildKit, imong gihubit ang imong pagtukod sa makausa ug tugotan ang sistema sa pagdumala sa piho nga arkitektura nga pagtipon nga klaro. Rust nga mga proyekto nga nagkinahanglan og cross-compilation, Go projects nga adunay CGO dependencies, Python packages nga adunay C extensions — BuildKit ang nagdumala sa emulation layer nga wala kinahanglana nga masabtan nimo ang mga detalye sa matag target nga plataporma.

Ang praktikal nga bili sa negosyo dinhi masukod. Ang usa ka team nga nagpadagan og 200 ka container sa AWS Graviton nga mga instances sa $0.04 kada vCPU-hour kumpara sa katumbas nga x86 nga instance sa $0.056 kada vCPU-hour makadaginot og halos $11,520 kada tuig kada 100 vCPUs — puros gikan sa pagpili sa hustong arkitektura. Ang paghimo niana nga pagpili nga ma-access nga walay paningkamot sa re-engineering mao gayud ang matang sa pag-optimize sa imprastraktura nga mobayad dayon sa kaugalingon.

Sekreto nga Pagdumala nga Wala Nagtulo sa mga Layer sa Imahe

Usa sa labing wala kaayo gipabilhan nga mga bahin sa BuildKit mao ang mga sekreto nga API. Ang klasiko nga magtutukod sa Docker wala’y limpyo nga paagi aron maipasa ang mga kredensyal sa usa ka pagtukod kung wala ang mga kredensyal nga mahimo’g matapos sa usa ka layer sa imahe. Ang mga developers nagtrabaho sa palibot niini uban sa multi-stage nga pagtukod, ARG mga instruksyon, ug mabinantayon nga pag-order — apan ang risgo sa aksidenteng pagluto sa usa ka API key o pribadong SSH key ngadto sa usa ka gipadala nga imahe nagpabilin nga dili komportable nga taas. Ang mga security scanner kanunayng mangitag mga hardcoded nga kredensyal sa mga hulagway sa container nga gipatik ngadto sa publikong mga rehistro, ug daghan niadtong mga pagtulo direkta nga nagsubay balik sa clumsy nga sekreto nga pagdumala atol sa pagtukod.

Ang

BuildKit's --secret nga bandila nag-mount sa sensitibo nga datos ngadto sa build environment isip temporaryo nga filesystem path nga anaa lamang sa gidugayon sa piho nga RUN nga instruksiyon nga nagkinahanglan niini ug dili gayud makahikap sa bisan unsang image layer. Ang instruksiyon sa Dockerfile sama sa RUN --mount=type=secret,id=npmrc cat /run/secrets/npmrc > ~/.npmrc && npm install naghatag sa proseso sa pagtukod og access sa pribadong npm nga kredensyal nga walay mga kredensyal nga makita sa kataposang hulagway o bisan unsang intermediate layer. Ang parehas nga sumbanan magamit alang sa mga kredensyal sa PyPI, setting sa Maven, mga yawe sa SSH alang sa mga pribadong Git repository, ug bisan unsang ubang sensitibo nga materyal nga gikinahanglan sa imong proseso sa pagtukod.

Para sa mga team nga nagtukod og software nga nagtandog sa mga regulated nga industriya — mga platform sa pag-atiman sa panglawas, mga produkto sa fintech, HR software — ang kalainan tali sa "mga kredensyal tingali naa sa imahe" ug "mga kredensyal nga dili makita sa imahe" mao ang kalainan tali sa pagpasa sa usa ka pag-audit sa seguridad ug paggasto sa tulo ka semana sa pag-ayo sa mga nahibal-an. Ang mga plataporma sama sa Mewayz, nga nagpakusog sa mga operasyon sa negosyo alang sa kapin sa 138,000 ka tiggamit sa tibuok industriya sama sa payroll, HR, ug pag-invoice, nagdepende sa eksakto niining matang sa mapamatud-an nga postura sa seguridad sa ilang pagtukod ug pag-deploy sa mga pipeline aron mapadayon ang pagsalig nga gihatag sa mga kustomer ngadto sa ilang sensitibo nga pinansyal ug datos sa personnel.

Cache Exports: Paghimo sa CI Pipelines Aktuwal nga Paspas

Ang mga pipeline sa CI mao ang labing hinungdanon nga pasundayag sa pagtukod ug kung diin ang default nga kasinatian sa pagtukod sa Docker sa kasaysayan labing sakit. Ang bag-ong mga runner sa CI kasagaran magsugod sa walay sulod nga mga cache, nga nagpasabot nga ang matag pipeline run nag-recompile sa tanan gikan sa wala. Alang sa usa ka serbisyo sa Java nga adunay gatusan ka mga dependency sa Maven, usa ka proyekto sa Rust, o usa ka aplikasyon sa Python nga adunay bug-at nga lumad nga mga extension, nagpasabut kini nga mga oras sa pagtukod nga gisukod sa napulo ka minuto kaysa mga segundo. Ang gasto sa negosyo sa hinay nga CI dako kaayo — gipakunhod ang frequency sa deployment, mas taas nga feedback loops, ug ang mga inhenyero nga naglingkod nga walay trabaho nga naghulat nga makompleto ang mga pipeline sa dili pa sila makausa ug makapadayon.

Gisulbad kini sa feature sa pag-eksport sa cache sa BuildKit gamit ang mga ma-export nga cache manifests. Gamit ang --cache-to type=registry,ref=myregistry/myapp:cache ug --cache-from type=registry,ref=myregistry/myapp:cache, ang BuildKit moduso ug detalyadong cache snapshot ngadto sa usa ka registry human sa matag pagtukod ug mobira niini sa pagsugod sa sunod. Ang cache kay content-addressed, mao nga ang tinuod nga giusab nga mga layer lang ang makuha pag-usab. Ang mga team nga naggamit niini nga pattern sa GitHub Actions, GitLab CI, ug CircleCI kanunay nga nagputol sa mga oras sa pipeline gikan sa kinse ka minuto ngadto sa ubos sa tulo sa sunod nga pagdagan. Ang kaugalingon nga dokumentasyon sa GitHub sa mga advanced nga Docker build workflows nagrekomendar niini nga sumbanan alang niini nga rason.

Ang pinakapaspas nga pagtukod mao ang usa nga dili na nimo kinahanglan nga padaganon pag-usab. Ang layered, content-addressed nga cache system sa BuildKit dili lang makapadali sa mga build — kini naghimo sa tibuok nga konsepto sa usa ka "build" nga mas maalamon, naghimo sa usa ka balikbalik nga compilation ngadto sa usa ka incremental diff sa eksakto kung unsa ang nausab.

Ang mga pag-eksport sa cache limpiyo usab nga nahiusa sa mga workflow sa pag-uswag nga nakabase sa sanga. Mahimo nimong i-configure ang imong pipeline sa CI aron mahibalik gikan sa cache nga piho sa sanga ngadto sa punoan nga cache sa sanga kung wala’y cache sa sanga, nagpasabut nga ang mga bag-ong sanga nakabenepisyo dayon gikan sa mainit nga cache nga natipon sa imong panguna nga linya sa pag-uswag. Makakuha ang mga inhenyero og paspas nga feedback gikan sa ilang una nga commit sa usa ka bag-ong branch imbes nga maghulat sa usa ka cold-start nga silot.

💡 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 →

Mga Frontend sa BuildKit: Pagtukod Labaw sa Dockerfiles

Tingali ang labing gamay nga nahibal-an nga kapabilidad sa BuildKit mao nga ang Dockerfiles usa ra ka posible nga format sa pag-input - dili usa ra. Ang BuildKit adunay usa ka pluggable nga arkitektura sa frontend nga nagtugot sa hingpit nga naandan nga paghimo sa kahulugan sa mga pinulongan ug mga format. Ang frontend gipiho sa # syntax= nga direktiba sa ibabaw sa imong build file, nga nagsulti sa BuildKit sa pagbitad sa usa ka partikular nga frontend nga hulagway ug gamiton kini sa pag-parse ug pag-execute sa nahabilin nga file.

Kini nga arkitektura nakapahimo sa daghang makapadani nga mga proyekto. Ang panagsama sa Buildpacks nagtugot sa BuildKit sa paghimo og mga imahen sa sulud gikan sa code sa gigikanan sa aplikasyon nga wala’y bisan unsang Dockerfile - kini nakamatikod sa sinultian, nagpili sa angay nga base nga mga imahe, ug awtomatikong nag-assemble sa usa ka sudlanan nga andam sa produksiyon. Ang HPC ug mga komunidad sa siyentipikong pagkompyuter migamit ug custom frontends aron ihulagway ang mga build sa domain-specific nga mga pinulongan nga nag-compile ngadto sa internal nga LLB (Low-Level Build) nga representasyon sa BuildKit. Ang docker/dockerfile:labs syntax frontend nga mga eksperimento nga adunay mga feature sama sa heredoc nga suporta, --network nga kontrol kada instruksyon, ug gipausbaw nga mga pahibalo sa cache sa dili pa kini motugpa sa stable nga Dockerfile syntax.

Ang abilidad sa paghubit sa imong kaugalingon nga frontend nagpasabot usab nga ang mga organisasyon nga adunay dili kasagaran nga mga kinahanglanon sa pagtukod dili kinahanglan nga mopili tali sa "shoehorn everything into Dockerfile syntax" ug "bug-os nga biyaan ang mga sudlanan." Ang usa ka team building FPGA firmware, embedded system images, o espesyal nga ML model containers makahulagway sa ilang build sa mga termino nga makataronganon alang sa ilang domain samtang naghimo gihapon og standard OCI-compliant container images nga nag-deploy bisan asa nga container run. Kini nga pagpalapad usa ka tinuod nga bentaha sa arkitektura kaysa mga sistema sa pagtukod nga nagtratar sa ilang format sa pag-input ingon naayo.

Provenance ug SBOM: Building para sa Post-SolarWinds World

Ang seguridad sa supply chain sa software mibalhin gikan sa teoretikal nga kabalaka ngadto sa prayoridad sa lebel sa board human sa paglapas sa SolarWinds niadtong 2020 ug sa pagkahuyang sa Log4Shell niadtong 2021. Ang Executive Order 14028 sa gobyerno sa US bahin sa cybersecurity, nga gi-isyu niadtong Mayo 2021, nagmando sa software bill of materials para sa mga federal contractor. Ang mga provenance nga pamatuod sa BuildKit ug ang mga feature sa SBOM generation maoy direktang tubag niining regulatory and security landscape.

Uban sa --provenance=true ug --sbom=true nga mga bandera, ang BuildKit nagmugna og cryptographically signed nga mga pagpamatuod nga naghulagway sa eksakto kung unsa ang nasulod sa usa ka container nga imahen — diin base nga mga hulagway ang gigamit, diin ang Dockerfile nga mga instruksiyon gipatuman, diin ang tinubdan nga mga file anaa, ug unsa ang mga eksternal nga dependency nga gikuha. Kini nga mga pamatuod nagsunod sa SLSA (Supply-chain Levels for Software Artifacts) nga gambalay ug ang in-toto attestation nga pormat, nga naghimo niini nga machine-verifiable sa policy engines sama sa Sigstore's Cosign ug OPA (Open Policy Agent).

Ang praktikal nga dagan sa trabaho nga mahimo niini morag ingon niini:

  1. Giduso sa developer ang code; Ang CI pipeline nag-trigger sa usa ka BuildKit nga pagtukod uban sa provenance enabled.
  2. Ang BuildKit nagmugna og pinirmahan nga SBOM nga naglista sa tanang sangkap ug sa ilang mga bersyon.
  3. Ang SBOM gipatik sa container registry kauban sa image manifest.
  4. Ang mga admission controller sa Kubernetes cluster nag-verify sa provenance sa dili pa tugotan ang deployment.
  5. Ang mga vulnerability scanner nagpangutana sa SBOM aron mailhan ang mga apektadong hulagway kung ang mga bag-ong CVE ibutyag.

Ang mga team nga nagpatuman niining tibuok nga pipeline mahimong makatubag sa mga pagbutyag sa kahuyang sulod sa mga oras imbes sa mga adlaw, tungod kay sila adunay tukma, mabasa sa makina nga mapa sa matag component sa matag nagdagan nga sudlanan. Para sa mga negosyo sama sa Mewayz nga nag-integrate pag-ayo sa mga operational workflow sa mga kustomer — pagpadagan sa payroll, pagdumala sa fleet data, pagproseso sa mga invoice — ang abilidad sa pagpakita sa usa ka estrikto, auditable nga supply chain usa ka kinahanglanon alang sa mga panag-istoryahanay sa pagbaligya sa negosyo, dili lang usa ka nindot nga nabatonan.

Pagsugod: Gikan sa Default nga Pagtukod hangtod sa Abanteng mga Pipeline

Ang BuildKit nagdagan na sa imong Docker nga palibot kung naggamit ka bag-o nga bersyon - Docker 23.0 ug sa ulahi mahimo kini pinaagi sa default. Ang una nga praktikal nga lakang alang sa kadaghanan nga mga koponan mao ang pagpagana sa Docker Buildx plugin, nga nagpadayag sa tibuuk nga bahin sa BuildKit nga gitakda pinaagi sa docker buildx subcommand. Ang pagpadagan sa docker buildx create --use nagpahimutang sa usa ka BuildKit builder nga instance nga adunay labaw nga kapabilidad kaysa sa default driver. Gikan didto, ang incremental nga pagsagop sa mga advanced nga feature makataronganon imbes mosulay sa pagsagop sa tanan sa makausa.

Ang usa ka makatarunganon nga agianan sa pagsagop alang sa usa ka team nga karon naghimo sa batakang pagtukod sa docker nga mga pag-ampo morag pagdugang sa mga pag-eksport sa cache sa CI una — naghatud kini dayon, masukod nga pagpaayo sa katulin nga adunay gamay nga pagbag-o sa configuration. Ang multi-platform nga pagtukod nahimong bililhon kung ang team nagsugod sa pag-target sa imprastraktura sa ARM. Ang sekreto nga pag-mount angayan nga gamiton bisan unsang orasa ang mga pribadong pakete nga rehistro o mga yawe sa SSH makita sa konteksto sa pagtukod. Makataronganon ang mga panghimatuod sa gigikanan aron mahimo kung ang mga kinahanglanon sa pagsunod o gipangayo sa kostumer sa negosyo kinahanglan ang dokumentasyon sa kadena sa suplay.

Ang mas lawom nga leksyon sa BuildKit mahitungod sa tinuyo nga pagtukod. Nagpadala ka man ug usa ka sudlanan alang sa usa ka microservice, usa ka machine learning inference endpoint, o usa ka komplikadong plataporma sama sa Mewayz's suite sa 207 nga mga modulo sa negosyo, ang proseso sa pagtukod dili usa ka pormalidad nga imong gidali-dali paingon sa pag-deploy - kini usa ka engineering artifact nga nagpakita sa kalidad, postura sa seguridad, ug pagkahamtong sa operasyon sa tanan nga gipadala gikan niini. Ang BuildKit naghatag kanimo sa mga himan aron mahimo kanang artifact nga maayo kaayo. Ang pangutana mao lang kung mogahin ka ba og panahon sa paggamit niini.

Mga Pangutana nga Kanunayng Gipangutana

Unsa ang BuildKit ug unsa ang kalainan niini sa klasiko nga sistema sa pagtukod sa Docker?

Ang BuildKit mao ang sunod nga henerasyon nga makina sa pagtukod sa Docker, gipaila sa Docker 18.09 ug gihimo ang default sa Docker 23.0. Dili sama sa classic builder, ang BuildKit nagsuporta sa parallel layer execution, advanced caching strategies, secret mounting, ug cross-platform builds. Gitratar niini ang proseso sa pagtukod isip usa ka directed acyclic graph (DAG), nga makapahimo sa mas maalamon nga resolusyon sa dependency ug mas paspas nga mga panahon sa pagtukod alang sa komplikado, multi-stage nga Dockerfiles.

Kinahanglan ba kong mag-install ug bisan unsa nga dugang aron masugdan ang paggamit sa BuildKit sa Docker?

Wala'y gikinahanglan nga dugang nga pag-instalar kung nagdagan ka sa Docker 23.0 o sa ulahi - ang BuildKit gipalihok pinaagi sa default. Sa mga daan nga bersyon, mahimo nimo kini nga i-aktibo pinaagi sa pag-set sa environment variable DOCKER_BUILDKIT=1 sa dili pa ipadagan ang imong build commands. Para sa mga advanced nga kaso sa paggamit sama sa remote build caches o multi-platform build, mahimo nimong i-configure ang usa ka dedikado nga Buildx builder nga instance gamit ang docker buildx create.

Magamit ba ang BuildKit sa paghimog mga artifact lapas sa naandan nga mga imahen sa sudlanan?

Oo, ug usa kini sa labing dili kaayo gipabilhan nga kapabilidad sa BuildKit. Gamit ang custom frontends ug ang --output flag, ang BuildKit makahimo og hilaw nga binary, tarballs, static nga website, ug uban pang arbitraryong file artifacts — dili lang OCI nga mga hulagway. Kini naghimo niini nga usa ka general-purpose build engine nga natural nga mohaum sa polyglot monorepos ug complex CI pipelines diin ang lain-laing mga team nagkinahanglan og lain-laing mga output format gikan sa usa ka hiniusa nga toolchain.

Giunsa nga nahiangay ang BuildKit sa usa ka mas lapad nga plataporma sa DevOps kauban ang mga himan sama sa Mewayz?

Gidumala sa BuildKit ang ubos nga lebel sa pagtukod nga layer, apan ang mga modernong tim sa pagpauswag kinahanglan usab nga magdumala sa mga daloy sa trabaho sa negosyo, paghatud sa kliyente, ug mga proseso sa operasyon. Ang mga plataporma sama sa Mewayz — usa ka 207-module nga OS sa negosyo sugod sa $19/mo — mokomplemento sa tooling sa imprastraktura pinaagi sa pagtabon sa operational nga bahin sa mga negosyo sa software. Ang pagpares sa episyente nga mga pipeline sa pagtukod nga gipaandar sa BuildKit sa usa ka all-in-one nga plataporma sama sa Mewayz naghatag sa mga team og kompletong stack gikan sa code artifact ngadto sa paghatod sa customer.