Hacker News

BuildKit: Dockerren ezkutuko harribitxia, ia edozer eraiki dezakeena

Iruzkinak

12 min read Via tuananh.net

Mewayz Team

Editorial Team

Hacker News

BuildKit: Dockerren ezkutuko harribitxia, ia edozer eraiki dezakeena

Garatzaile gehienek Docker ezagutzen dute softwarea bidaltzeko modua aldatu zuen edukiontzien exekuzio-denbora dela. Askoz gutxiagok dakite Dockerren eraikuntza moderno bakoitzaren gainazalean isilean mugitzen ari den motorra - BuildKit, 18.09 bertsiotik Docker-ekin bidaltzen den hurrengo belaunaldiko eraikuntza-sistema eta Docker 23.0-ko backend lehenetsia bihurtu zen. Ingeniariek Kubernetesen konfigurazioei eta mikrozerbitzuen ereduei buruz etengabe eztabaidatzen duten bitartean, BuildKit etengabe eboluzionatzen ari da DevOps ekosistemako eraikuntza sistema indartsu eta malguenetako batean. docker build azkarrago gisa tratatu baduzu, gaitasun izugarria uzten ari zara mahai gainean. Errendimendu handiko CI/CD kanalizazioak erabiltzen dituzten enpresek eraikuntza-denborak % 50-70 murriztu dituzte BuildKit-ek benetan eskaintzen duena ulertuta, eta hori hasiera besterik ez da.

Zerk egiten du BuildKit eraikitzaile klasikotik funtsean desberdina

Jatorrizko Docker eraikitze-motorrak Dockerfile-ren argibideak sekuentzialki exekutatu zituen, geruza bat aldi berean, paraleloan segurtasunez zer lan gerta zitekeen jakin gabe. BuildKit-ek exekuzio-eredu lineal hori grafiko azikliko zuzendu batekin (DAG) ordezkatzen du, eraikuntza-urratsek elkarrengandik zein ez eta zeintzuk ez duten ulertzen duen mendekotasun-grafiko bat. Etapa independenteak aldi berean exekutatzen dira, erabiltzen ez diren faseak guztiz saltatzen dira eta eraikuntza osoa nahi duzunaren deskribapen deklaratibo bihurtzen da, ordena egokian errezitatu behar dituzun urratsen sekuentzia ezinbesteko bat baino.

Arkitektura aldaketa honek abiaduraz haratago doazen ondorio praktikoak ditu. Etapa anitzeko Dockerfile batek fase batean Go bitar bat konpilatzen duenean, beste batean Node.js menpekotasunak deskargatzen dituenean eta hirugarren batean ekoizpen-irudi bat muntatzen duenean, BuildKit-ek lehen bi etapak aldi berean exekutatu ditzake. CI korrikalari indartsu bati lau minutu behar zituen eraikuntza orain laurogeita hamar segundo baino gutxiagotan osatzen da. Stripe, Shopify eta eskala handiko beste ingeniaritza talde batzuek antzeko irabaziak dokumentatu dituzte barne-tresneriaren atzera begirakoetan. DAG ereduak BuildKit-ek eraikuntza-metadatu oso zehatzak sor ditzakeela esan nahi du, hornikuntza-katearen segurtasunerako izugarri garrantzitsuak diren jatorri-aitorpenak eta software-faktura (SBOM) sorkuntza bezalako funtzioetarako oinarria.

Cache baliogabetzearen funtzionamenduan ere aldaketa kontzeptual bat dago. Eraikitzaile klasikoak baliogabetu zituen aldatutako instrukzioen azpian dauden geruza guztiak. BuildKit-ek edukiaren hash-ak egiten ditu sarrera bakoitzean, beraz, Dockerfile batean iruzkin bat aldatzeak ez du hondatzen hogeita hamar minutuko konpilazioa adierazten duen cache-sarrera bat. Zure eraikuntza-cachea zure ingeniaritza-taldearentzat bost minutuko eta berrogei minutuko feedback-begizta baten arteko aldea denean, zehaztasun horrek hasieran badirudi baino askoz ere garrantzia handiagoa du.

Plataforma anitzeko eraikuntzak: komando bat, arkitektura bakoitza

BuildKit-en --platform banderak eta QEMU integrazioak sistema anitzeko koordinazio arazo mingarria zena komando bakar batean bihurtzen dute. docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 exekutatzen ekoizteko prest dauden hiru irudi sortzen ditu paraleloan eraikitze-deialdi bakar batetik. Gaitasun hori funtsezkoa bihurtu da industria ARM aldera aldatzen den heinean — AWS Graviton3 instantziek etengabe % 40 hobea ematen dute prezio-errendimendu hobea web-zerbitzaria eta datu-prozesatzea bezalako lan-kargan, eta Apple Silicon-ek milioika ingeniariren garapen-makina lehenetsi bihurtu du ARM.

BuildKit-en plataforma anitzeko euskarria heldu baino lehen, arkitektura desberdinetarako eraikuntza-bide bereiziak mantentzea benetako kostu-zentroa zen. Taldeek Dockerfile anitz mantendu zituzten, CI kanalizazio bereiziak exekutatu zituzten arkitektura ezberdineko korrikalarietan edo, besterik gabe, x86 irudiak nonahi bidaltzen zituzten eta ARM azpiegituretan errendimendu zigorra ordaindu zuten. BuildKit-ekin, zure eraikuntza behin definitzen duzu eta sistemak arkitektura espezifikoko konpilazioa modu gardenean kudeatzen uzten diozu. Konpilazio gurutzatua behar duten Rust proiektuak, CGO menpekotasunekin Go proiektuak, C luzapenak dituzten Python paketeak — BuildKit-ek emulazio-geruza kudeatzen du helburu-plataforma bakoitzaren xehetasunak ulertzea eskatu gabe.

Hemen negozioaren balio praktikoa neurgarria da. AWS Graviton instantzian 200 edukiontzi exekutatzen dituen talde batek 0,04 $ vCPU orduko x86 instantzia baliokidearen aldean 0,056 $ vCPU orduko 11.520 $ inguru aurrezten ditu urtero 100 vCPU bakoitzeko, arkitektura egokia aukeratzetik soilik. Aukera hori berriro ingeniaritza-esfortzurik gabe eskuragarri jartzea berehala ordaintzen den azpiegituraren optimizazio mota da.

Kudeaketa sekretua Irudi geruzetan isuri gabe

Gutxien estimatzen den BuildKit-en eginbideetako bat bere sekretuen APIa da. Docker eraikitzaile klasikoak ez zuen kredentzialak eraikuntza batera pasatzeko modu garbirik, kredentzial horiek irudi geruza batean amaitu gabe. Garatzaileek etapa anitzeko eraikuntzarekin, ARG argibideekin eta arretaz ordenatuta lan egin zuten, baina API gako edo SSH gako pribatu bat bidalitako irudi batean ustekabean labean jartzeko arriskua oso handia izaten jarraitzen zuen. Segurtasun eskanerrek ohiko kredentzialak kodetutako kredentzialak aurkitzen dituzte erregistro publikoetan argitaratutako edukiontzien irudietan, eta filtrazio horietako asko eraikitzeetan zehar sekretu-kudeaketa traketsetik dator zuzenean.

BuildKit-en --secret banderak datu sentikorrak muntatzen ditu eraikuntza-ingurunean fitxategi-sistemaren bide aldi baterako, hori behar duen RUN instrukzio espezifikoaren iraupenerako soilik existitzen dena eta inoiz ez du irudi-geruzarik ukitzen. RUN --mount=type=secret,id=npmrc cat /run/secrets/npmrc > ~/.npmrc && npm install bezalako Dockerfile instrukzio batek npm kredentzial pribatuetarako sarbidea ematen dio eraikuntza-prozesuari kredentzial horiek azken irudian edo tarteko geruzaren batean agertu gabe. Eredu berdinak funtzionatzen du PyPI kredentzialetarako, Maven ezarpenetarako, Git biltegi pribatuetarako SSH gakoetarako eta zure eraikuntza-prozesuak behar duen beste edozein material sentikorrekin.

Industria arautuak ukitzen dituen softwarea eraikitzen duten taldeentzat (osasun-plataformak, fintech produktuak, HR softwarea) "kredentzialak irudian egon daitezke" eta "kredentzialak ezin dira irudian egon" arteko aldea segurtasun-ikuskaritza bat gainditzea eta aurkikuntzak konpontzeko hiru aste igarotzea da. Mewayz bezalako plataformek, 138.000 erabiltzaile baino gehiagorentzat negozio-eragiketak bultzatzen dituztenak, besteak beste, nominak, HRak eta fakturak, hala nola, nominak, HRak eta fakturak, beren eraikuntza eta inplementazio-bideetan segurtasun-jarrera frogagarri horren araberakoak dira bezero horiek beren finantza- eta langile-datu sentikorrekiko konfiantza mantentzeko.

Cache-esportazioak: CI Pipeline benetan azkar egitea

CI kanalizazioak dira eraikuntzaren errendimendua garrantzitsuena den tokian eta Dockerren eraikuntza-esperientzia lehenetsia historikoki mingarriena izan den tokian. CI korrikalari freskoak normalean cache hutsekin hasten dira, hau da, kanalizazio-exekuzio bakoitzak dena berriro konpilatzen du hutsetik. Mavenen ehunka mendekotasun, Rust proiektu bat edo jatorrizko luzapen astunak dituen Python aplikazio baterako Java zerbitzu baterako, horrek esan nahi du segundu baino hamar minututan neurtutako eraikitze denborak. CI motelaren negozio-kostua izugarria da: inplementazio-maiztasun murriztua, feedback-begizta luzeagoak eta ingeniariak geldirik eserita kanalizazioak amaitu zain, batu eta aurrera egin aurretik.

BuildKit-en cache esportatzeko eginbideak hau konpontzen du esporta daitezkeen cacheko manifestuekin. --cache-to type=registry,ref=myregistry/myapp:cache eta --cache-from type=registry,ref=myregistry/myapp:cache erabiliz, BuildKit-ek cachearen argazki zehatza erregistro batera eramaten du eraikuntza bakoitzaren ondoren eta hurrengoaren hasieran ateratzen du. Cachea edukiari zuzenduta dago, beraz, benetan aldatutako geruzak bakarrik lortzen dira berriro. GitHub Actions, GitLab CI eta CircleCI-n eredu hau erabiltzen duten taldeek ohiko kanalizazio-denborak hamabost minututik hiru baino gutxiagora murrizten dituzte hurrengo exekuzioetan. GitHub-ek Docker-en eraikuntza-fluxu aurreratuei buruzko dokumentazioak oso gomendatzen du eredu hau arrazoi hori dela eta.

Eraiketarik azkarrena inoiz berriro exekutatu behar ez duzuna da. BuildKit-en geruzetan, edukiari zuzendutako cache-sistemak ez ditu eraikuntzak bizkortzen soilik, "eraikitze" kontzeptu osoa adimentsuago bihurtzen du, behin eta berriz konpilazio bat aldatu denaren desberdintasun inkremental bihurtuz.

Cache-esportazioak ere garbi integratzen dira adarretan oinarritutako garapen-fluxuekin. Zure CI kanalizazioa konfigura dezakezu adar bateko cache espezifiko batetik adar nagusiko cachera itzultzeko adar-cacherik ez dagoenean, hau da, adar berriek zure garapen-lerro nagusiak pilatutako cache epeletik berehala etekina ateratzen dute. Ingeniariek adar berri batean egindako lehen konpromisotik iruzkin azkarrak jasotzen dituzte, hotzeko zigorra itxaron beharrean.

💡 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: Dockerfiles haratago eraikitzea

Agian BuildKit-en gaitasun gutxien ezagutzen dena da Dockerfiles sarrerako formatu posible bat besterik ez dela, ez bakarra. BuildKit-ek interfaze-arkitektura entxufagarria du, eta guztiz pertsonalizatutako definizio-lengoaia eta formatuak ahalbidetzen ditu. Frontend-a zure eraikuntza-fitxategiaren goialdean dagoen # syntax= zuzentarauak zehazten du, eta BuildKit-i esaten dio frontend-eko irudi jakin bat ateratzeko eta hura erabiltzeko gainerako fitxategia analizatzeko eta exekutatzeko.

Arkitektura honek hainbat proiektu erakargarri ahalbidetu ditu. Buildpacks integrazioari esker, BuildKit-ek aplikazioaren iturburu-kodetik edukiontzien irudiak eraiki ditzake Dockerfilerik gabe; hizkuntza detektatzen du, oinarrizko irudi egokiak aukeratzen ditu eta ekoizpenerako prest dagoen edukiontzi bat muntatzen du automatikoki. HPC-k eta informatika zientifikoko komunitateek frontend pertsonalizatuak erabili dituzte domeinu espezifikoetako lengoaietan konpilazioak deskribatzeko, BuildKit-en barneko LLB (Low-Level Build) irudikapenera konpilatzen direnak. docker/dockerfile:labs sintaxia frontend-ak heredoc euskarria, --network instrukzio bakoitzeko kontrola eta Dockerfile sintaxi egonkorrean kokatu aurretik cache-iradokizun hobetuak bezalako ezaugarriekin esperimentatzen du.

Zure frontend-a definitzeko gaitasunak ere esan nahi du ezohiko eraikuntza-eskakizunak dituzten erakundeek ez dutela aukeratu behar "dena Dockerfile sintaxia sartu" eta "ontziak erabat utzi". FPGA firmware, sistema txertatuen irudiak edo ML ereduko edukiontzi espezializatuak eraikitzeko talde batek domeinurako zentzua duten terminoetan deskriba ditzakete, edukiontziak exekutatzen diren edozein lekutan zabaltzen diren OCI-rekin bat datozen edukiontzi-irudi estandarrak ekoizten dituzten bitartean. Hedagarritasun hori benetako abantaila arkitektonikoa da sarrera-formatua finkotzat hartzen duten eraikuntza-sistemen aurrean.

Jatorria eta SBOM: Post-SolarWinds Mundurako eraikina

Softwarearen hornikuntza-katearen segurtasuna kezka teorikotik taula-mailako lehentasunera pasatu zen 2020an SolarWinds urraketaren eta 2021ean Log4Shell ahultasunaren ondoren. AEBetako Gobernuaren 14028 Agindu Exekutiboak, 2021eko maiatzean emandako zibersegurtasunari buruzkoak, kontratatzaile federalentzako software-faktura agindu zuen. BuildKit-en jatorriaren egiaztagiriak eta SBOM sorkuntza-eginbideek erantzun zuzena dute arau- eta segurtasun-esparru honi.

--provenance=true eta --sbom=true markekin, BuildKit-ek kriptografikoki sinatutako egiaztagiriak sortzen ditu, edukiontzi-irudi batean zer sartu zen zehatz-mehatz deskribatzen dutenak: zein oinarrizko irudi erabili ziren, zein Dockerfile-ren instrukzio exekutatu ziren, zein iturburu-fitxategi zeuden eta zein kanpoko menpekotasun lortu ziren. Atestazio hauek SLSA (Supply-chain Levels for Software Artifacts) esparrua eta osoko egiaztapen formatua jarraitzen dute, Sigstore's Cosign eta OPA (Open Policy Agent) bezalako politika-motorrek makinaz egiaztatu ahal izateko.

Honek ahalbidetzen duen lan-fluxu praktikoa honelakoa da:

  1. Garatzaileak kodea bultzatzen du; CI kanalizazioak BuildKit eraikuntza bat abiarazten du jatorria gaituta.
  2. BuildKit-ek sinatutako SBOM bat sortzen du osagai guztiak eta haien bertsioak zerrendatzen dituena.
  3. SBOM edukiontzien erregistroan argitaratzen da irudiaren manifestuarekin batera.
  4. Kubernetes klusterreko onarpen-kontrolatzaileek jatorria egiaztatzen dute hedapena baimendu aurretik.
  5. Ahultasun-eskanerrek SBOMri kontsulta egiten diote kaltetutako irudiak identifikatzeko CVE berriak ezagutarazten direnean.

Hodibide osoa inplementatzen duten taldeek ahultasun-adierazpenei orduetan erantzun diezaiekete egunetan baino, exekutatzen ari diren edukiontzi guztietan makinaz irakur daitekeen osagai guztien mapa zehatza dutelako. Bezeroen lan-fluxu operatiboetan sakon integratzen diren Mewayz bezalako enpresentzat (nominak kudeatzea, flotaren datuak kudeatzea, fakturak prozesatzea) hornikuntza-kate zorrotza eta ikuskagarria erakusteko gaitasuna gero eta baldintza handiagoa da enpresen salmenta-elkarrizketetarako, ez soilik atsegina izatea.

Hasteko: lehenetsitako eraikuntzatik kanalizazio aurreratuetara

BuildKit dagoeneko exekutatzen ari da zure Docker ingurunean, azken bertsioa erabiltzen ari bazara — Docker 23.0 eta ondorengoak gaitu lehenespenez. Talde gehienentzako lehen urrats praktikoa Docker Buildx plugina gaitzea da, zeinak BuildKit-en eginbide multzo osoa erakusten du docker buildx azpikomandoaren bidez. docker buildx create --use exekutatzeak BuildKit builder instantzia bat konfiguratzen du lehenetsitako kontrolatzailea baino gaitasun gehiago duena. Hortik aurrera, funtzio aurreratuak gero eta gehiago hartzeak zentzua du dena aldi berean hartzen saiatu beharrean.

Oinarrizko docker build deiketak egiten ari den talde batentzako zentzuzko harrera-bide batek lehenik CI-ra cache-esportazioak gehitzea dirudi; honek abiadura hobekuntza berehala eta neurgarriak eskaintzen ditu konfigurazio aldaketa minimoekin. Plataforma anitzeko eraikuntzak baliotsu bihurtzen dira taldea ARM azpiegitura bideratzen hasten denean. Muntatze sekretuak merezi du paketeen erregistro pribatuak edo SSH gakoak eraikitzeko testuinguruan agertzen diren bakoitzean hartzea. Jatorriaren aitorpenek zentzua dute gaitzeko betetze-eskakizunek edo enpresa-bezeroen eskakizunek hornidura-katearen dokumentazioa beharrezkoa egiten dutenean.

BuildKit-en ikasgai sakona nahita eraikitzea da. Mikrozerbitzu baterako edukiontzi bat bidaltzen ari zaren ala ez, ikaskuntza automatikoko inferentzia amaierako puntu bat edo Mewayz-en 207 negozio-moduluen multzoa bezalako plataforma konplexu bat bidaltzen ari zaren ala ez, eraikitze-prozesua ez da inplementaziorako bidean azkar egiten duzun formalitatea; hortik ateratzen den guztiaren kalitatea, segurtasun jarrera eta heldutasun operatiboa islatzen dituen ingeniaritza-artefaktua da. BuildKit-ek artefaktu hori bikaina izateko tresnak ematen dizkizu. Horiek erabiltzeko denbora hartzen duzun ala ez da galdera.

Ohiko galderak

Zer da BuildKit eta zer desberdina da Docker eraikuntza-sistema klasikotik?

BuildKit Dockerren hurrengo belaunaldiko eraikuntza-motorra da, Docker 18.09-n sartua eta lehenetsia Docker 23.0-n. Eraikitzaile klasikoak ez bezala, BuildKit-ek geruza paraleloen exekuzioa, caching estrategia aurreratuak, sekretuak muntatzea eta plataforma anitzeko eraikuntzak onartzen ditu. Eraikuntza-prozesua zuzendutako grafiko azikliko (DAG) gisa tratatzen du, mendekotasun-ebazpen adimentsuagoa eta eraikuntza-denbora izugarri azkarragoak ahalbidetuz etapa anitzeko Dockerfile konplexuetarako.

Docker-ekin BuildKit erabiltzen hasteko ezer gehigarririk instalatu behar al dut?

Ez da instalazio gehigarririk behar Docker 23.0 edo berriagoa exekutatzen ari bazara — BuildKit lehenespenez gaituta dago. Bertsio zaharretan, ingurune-aldagaia DOCKER_BUILDKIT=1 ezarriz aktiba dezakezu zure eraikuntza-komandoak exekutatu aurretik. Erabilera-kasu aurreratuetarako, adibidez, urruneko eraikuntza-cacheak edo plataforma anitzeko eraikuntzak, baliteke Buildx builder instantzia dedikatu bat konfiguratu nahi izatea docker buildx create erabiliz.

Erabil al daiteke BuildKit edukiontzi-irudi estandarren gainetik artefaktuak eraikitzeko?

Bai, eta hau da BuildKit-en gutxiesten duen gaitasunetako bat. Frontend pertsonalizatuak eta --output marka erabiliz, BuildKit-ek bitar gordinak, tarball-ak, webgune estatikoak eta bestelako fitxategi artefaktu arbitrarioak sor ditzake, ez OCI irudiak soilik. Honek helburu orokorreko eraikuntza-motorra bihurtzen du, modu naturalean sartzen den monorepo poliglotetan eta CI kanalizazio konplexuetan, non talde ezberdinek tresna-kate bateratu bateko irteera-formatu desberdinak behar dituzten.

Nola sartzen da BuildKit DevOps plataforma zabalago batean Mewayz bezalako tresnekin batera?

BuildKit-ek behe-mailako eraikuntza-geruza kudeatzen du, baina garapen-talde modernoek negozio-fluxuak, bezeroen entrega eta prozesu operatiboak ere kudeatu behar dituzte. Mewayz bezalako plataformek, 207 moduluko negozio-sistema eragilea, 19 $ hilean hasiko dena, azpiegitura-tresneria osatzen dute, software-enpresen alde operatiboa estaltzen baitute. BuildKit-ek bultzatutako eraikuntza kanalizazio eraginkorrak Mewayz bezalako plataforma bateratu batekin parekatzeak pilaketa osoa ematen die taldeei kode-artefaktutik bezeroaren entregara arte.