Hacker News

BuildKit: Demək olar ki, hər şeyi yarada bilən Dockerin Gizli Gem

Şərhlər

21 min read Via tuananh.net

Mewayz Team

Editorial Team

Hacker News

BuildKit: Demək olar ki, hər şeyi yarada bilən Dokerin Gizli Gem

Əksər tərtibatçılar Docker-i proqram təminatının necə göndərildiyini dəyişdirən konteyner işləmə vaxtı kimi tanıyırlar. Hər müasir Docker konstruksiyası altında səssizcə səslənən mühərrik haqqında daha az adam bilir – BuildKit, 18.09 versiyasından bəri Docker ilə göndərilən və Docker 23.0-da defolt arxa plana çevrilən növbəti nəsil qurma sistemi. Mühəndislər Kubernetes konfiqurasiyaları və mikroservis nümunələri haqqında sonsuz mübahisə etsələr də, BuildKit davamlı olaraq DevOps ekosistemində ən güclü, çevik qurma sistemlərindən birinə çevrilir. Əgər siz onu daha sürətli docker build kimi qəbul edirsinizsə, siz masada böyük imkanlar buraxmış olursunuz. Yüksək məhsuldarlığa malik CI/CD boru kəmərləri ilə işləyən şirkətlər, sadəcə olaraq BuildKit-in əslində nə təklif etdiyini başa düşərək, tikinti vaxtlarını 50-70% azaldıblar – və bu, yalnız başlanğıcdır.

BuildKit-i Klassik Qurucudan əsaslı şəkildə fərqləndirən nədir

Orijinal Docker qurma mühərriki Dockerfile təlimatlarını ardıcıl olaraq, hər dəfə bir qat yerinə yetirirdi və paralel olaraq hansı işin təhlükəsiz baş verə biləcəyini bilmirdi. BuildKit həmin xətti icra modelini yönləndirilmiş asiklik qrafik (DAG) ilə əvəz edir - hansı qurma addımlarının bir-birinə güvəndiyini və hansının olmadığını başa düşən asılılıq qrafiki. Müstəqil mərhələlər eyni vaxtda yerinə yetirilir, istifadə olunmamış mərhələlər tamamilə atlanır və bütün quruluş düzgün ardıcıllıqla oxumalı olduğunuz addımların imperativ ardıcıllığından daha çox istədiyinizin deklarativ təsvirinə çevrilir.

Bu memarlıq dəyişikliyi sürətdən kənar praktik nəticələrə malikdir. Çoxmərhələli Dockerfile bir mərhələdə Go binarını tərtib etdikdə, digərində Node.js asılılıqlarını endirdikdə və üçüncü mərhələdə istehsal şəklini yığdıqda BuildKit ilk iki mərhələni eyni vaxtda işlədə bilər. Əvvəllər güclü CI qaçışçısında dörd dəqiqə çəkmiş bir quruluş indi doxsan saniyədən az müddətdə tamamlanır. Stripe, Shopify və bir çox digər yüksək miqyaslı mühəndislik qrupları öz daxili alət retrospektivlərində oxşar qazancları sənədləşdirmişlər. DAG modeli, həmçinin, BuildKit-in yüksək dəqiqlikli tikinti metadatasını yarada bilməsi deməkdir - mənbə sertifikatları və təchizat zəncirinin təhlükəsizliyi üçün böyük əhəmiyyət kəsb edən proqram təminatı sənədləri (SBOM) kimi xüsusiyyətlər üçün əsasdır.

Keşin etibarsızlığının necə işlədiyinə dair konseptual dəyişiklik də var. Klassik qurucu hər hansı dəyişdirilmiş təlimatın altındakı hər təbəqəni etibarsız etdi. BuildKit hər girişdə məzmun hashlərini izləyir, beləliklə, Dockerfile-də şərhin dəyişdirilməsi otuz dəqiqəlik kompilyasiyanı əks etdirən keş girişini məhv etmir. Quraşdırma keşiniz mühəndislik komandanız üçün beş dəqiqəlik və qırx dəqiqəlik geribildirim dövrəsi arasındakı fərq olduqda, bu dəqiqlik ilkin göründüyündən daha çox əhəmiyyət kəsb edir.

Multi-Platformalar: Bir Əmr, Hər Memarlıq

BuildKit-in --platform bayrağı və QEMU inteqrasiyası bir vaxtlar ağrılı çox sistemli koordinasiya problemini tək əmrə çevirir. Çalışan docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 . bir qurma çağırışından paralel olaraq üç istehsala hazır təsvir yaradır. Sənaye ARM-ə doğru irəlilədikcə bu qabiliyyət kritik hala gəldi — AWS Graviton3 nümunələri veb xidmət və məlumatların emalı kimi iş yüklərində ardıcıl olaraq 40% daha yaxşı qiymət-performans təqdim edir və Apple Silicon ARM-i milyonlarla mühəndis üçün defolt inkişaf maşınına çevirdi.

BuildKit-in çox platformalı dəstəyi yetişməmişdən əvvəl müxtəlif arxitekturalar üçün ayrı-ayrı tikinti kəmərlərinin saxlanılması real xərc mərkəzi idi. Komandalar ya birdən çox Dockerfile saxladılar, fərqli arxitekturalı qaçışçılarda ayrıca CI boru kəmərlərini işlətdilər və ya sadəcə olaraq x86 şəkillərini hər yerə göndərdilər və ARM infrastrukturunda performans cəzasını ödədilər. BuildKit ilə siz quruluşunuzu bir dəfə müəyyənləşdirirsiniz və sistemin arxitekturaya aid kompilyasiyanı şəffaf şəkildə idarə etməsinə icazə verirsiniz. Çarpaz kompilyasiya tələb edən Rust layihələri, CGO asılılığı olan Go layihələri, C genişləndirmələri ilə Python paketləri — BuildKit sizdən hər bir hədəf platformanın təfərrüatlarını başa düşməyinizi tələb etmədən emulyasiya qatını idarə edir.

Burada praktiki biznes dəyəri ölçülə bilər. AWS Graviton instansiyalarında vCPU-saat üçün 0,04 dollar dəyərində 200 konteyner işlədən komanda, vCPU-saat üçün 0,056 dollar olan ekvivalent x86 instansiyası ilə müqayisədə 100 vCPU-ya ildə təxminən 11,520 dollar qənaət edir – sırf düzgün arxitekturanın seçilməsindən. Yenidən mühəndislik səyləri olmadan bu seçimi əlçatan etmək, özünü dərhal ödəyən infrastrukturun optimallaşdırılması növüdür.

Şəkil Qatlarına Sızmadan Gizli İdarəetmə

Ən çox qiymətləndirilməyən BuildKit xüsusiyyətlərindən biri onun gizli API-sidir. Klassik Docker qurucusu, etimadnamələri potensial olaraq görüntü qatında bitən bu etimadnamələr olmadan quruluşa ötürmək üçün heç bir təmiz yolu yox idi. Tərtibatçılar bunun ətrafında çoxmərhələli quruluşlar, ARG təlimatları və ehtiyatlı sifarişlə işlədilər, lakin təsadüfən API açarını və ya şəxsi SSH açarını göndərilən təsvirə yandırmaq riski narahat dərəcədə yüksək olaraq qaldı. Təhlükəsizlik skanerləri müntəzəm olaraq ictimai reyestrlərdə dərc edilmiş konteyner şəkillərində sərt kodlu etimadnaməsini tapır və bu sızmaların bir çoxu birbaşa quraşdırma zamanı yöndəmsiz məxfi rəftardan qaynaqlanır.

BuildKit-in --secret bayrağı həssas məlumatları yalnız xüsusi RUN təlimatının müddəti ərzində mövcud olan və heç bir şəkil qatına toxunmayan müvəqqəti fayl sistemi yolu kimi qurma mühitinə quraşdırır. RUN --mount=type=secret,id=npmrc cat /run/secrets/npmrc > ~/.npmrc && npm install kimi Dockerfile təlimatı tikinti prosesinə şəxsi npm etimadnaməsinə bu etimadnamələr heç vaxt yekun şəkildə və ya hər hansı aralıq təbəqədə görünmədən giriş imkanı verir. Eyni model PyPI etimadnamələri, Maven parametrləri, şəxsi Git depoları üçün SSH açarları və qurma prosesinizin tələb etdiyi hər hansı digər həssas material üçün işləyir.

Tənzimlənən sənayelərə - səhiyyə platformalarına, fintech məhsullarına, HR proqramına toxunan proqram təminatı yaradan komandalar üçün "etimadnamələr şəkildə ola bilər" və "etimadnamələr şəkildə ola bilməz" arasındakı fərq təhlükəsizlik auditindən keçmək və tapıntıların aradan qaldırılması üçün üç həftə sərf etmək arasındakı fərqdir. Əmək haqqı, HR və faktura kimi sənayelər üzrə 138 000-dən çox istifadəçinin biznes əməliyyatlarını gücləndirən Mewayz kimi platformalar müştərilərin həssas maliyyə və kadr məlumatlarına olan etimadını qorumaq üçün quraşdırma və yerləşdirmə boru kəmərlərində məhz bu cür sübut edilə bilən təhlükəsizlik mövqeyindən asılıdır.

Keş İxracları: CI Boru Kəmərlərinin Faktiki Sürətli Edilməsi

CI boru kəmərləri quraşdırma performansının ən vacib olduğu və defolt Docker qurma təcrübəsinin tarixən ən ağrılı olduğu yerdir. Təzə CI qaçışçıları adətən boş keşlərlə başlayır, yəni hər boru kəməri hər şeyi sıfırdan yenidən tərtib edir. Yüzlərlə Maven asılılığına malik Java xidməti, Rust layihəsi və ya ağır yerli genişlənmələri olan Python proqramı üçün bu, saniyələrlə deyil, on dəqiqələrlə ölçülən tikinti vaxtları deməkdir. Yavaş CI-nin biznes dəyəri çox böyükdür - azaldılmış yerləşdirmə tezliyi, daha uzun əks əlaqə dövrələri və mühəndislər boru kəmərlərinin birləşmədən və davam etmədən əvvəl tamamlanmasını gözləyən boş otururlar.

BuildKit-in keş ixrac xüsusiyyəti bunu ixrac edilə bilən keş manifestləri ilə həll edir. --cache-to type=registry,ref=myregistry/myapp:cache--cache-from type=registry,ref=myregistry/myapp:cache-dan istifadə edərək, BuildKit ətraflı keş şəklini reyestrə itələyir və hər qurulmadan sonra onu qeyd edir. Keş məzmun ünvanlıdır, ona görə də yalnız həqiqətən dəyişdirilmiş təbəqələr yenidən götürülür. GitHub Actions, GitLab CI və CircleCI-də bu nümunədən istifadə edən komandalar müntəzəm olaraq sonrakı qaçışlarda boru kəmərinin vaxtını on beş dəqiqədən üçə qədər azaldır. GitHub-un qabaqcıl Docker qurma iş axınları üzrə öz sənədləri məhz bu səbəbdən bu nümunəni ciddi şəkildə tövsiyə edir.

Ən sürətli qurma, bir daha işə salmaq məcburiyyətində qalmadığınız sistemdir. BuildKit-in laylı, məzmun ünvanlı keş sistemi təkcə qurma işlərini sürətləndirmir – o, bütün “qurma” konsepsiyasını daha ağıllı edir, təkrarlanan kompilyasiyanı dəqiq dəyişənlərin artımlı fərqinə çevirir.

Keş ixracı həmçinin filial əsaslı inkişaf iş axınları ilə təmiz şəkildə inteqrasiya olunur. Heç bir filial keşi olmadıqda, siz CI boru kəmərinizi filiala məxsus keşdən əsas filial keşinə qayıtmaq üçün konfiqurasiya edə bilərsiniz, yəni yeni filiallar əsas inkişaf xəttiniz tərəfindən yığılan isti keşdən dərhal faydalanır. Mühəndislər soyuq başlanğıc cəzasını gözləmək əvəzinə, yeni filialla bağlı ilk öhdəliklərindən sürətli rəy alırlar.

💡 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: Dockerfilesdən kənarda qurulma

Bəlkə də BuildKit-in ən az tanınan qabiliyyəti ondan ibarətdir ki, Dockerfiles yalnız bir mümkün daxiletmə formatıdır – tək deyil. BuildKit, tamamilə xüsusi qurma tərifi dilləri və formatlarına imkan verən qoşula bilən frontend arxitekturasına malikdir. Frontend, qurma faylınızın yuxarısındakı # syntax= direktivi ilə müəyyən edilir ki, bu da BuildKit-ə xüsusi ön görünüş şəklini çəkməyi və ondan faylın qalan hissəsini təhlil etmək və icra etmək üçün istifadə etməyi bildirir.

Bu arxitektura bir neçə cəlbedici layihəni aktivləşdirib. Buildpacks inteqrasiyası BuildKit-ə heç bir Dockerfile olmadan proqram mənbə kodundan konteyner şəkilləri yaratmağa imkan verir — o, dili aşkarlayır, müvafiq əsas şəkilləri seçir və istehsala hazır konteyneri avtomatik yığır. HPC və elmi hesablama icmaları, BuildKit-in daxili LLB (Aşağı Səviyyə Quraşdırma) təqdimatına qədər tərtib edilən domenə xas dillərdə quruluşları təsvir etmək üçün xüsusi ön hissələrdən istifadə etdilər. docker/dockerfile:labs sintaksisi sabit Dockerfile sintaksisinə düşməzdən əvvəl heredoc dəstəyi, --şəbəkə hər təlimata nəzarət və təkmil keş göstərişləri kimi xüsusiyyətlərlə təcrübələr aparır.

Öz frontendinizi müəyyən etmək bacarığı həm də o deməkdir ki, qeyri-adi quraşdırma tələbləri olan təşkilatlar "hər şeyi Dockerfile sintaksisinə daxil etmək" və "konteynerləri tamamilə tərk etmək" arasında seçim etmək məcburiyyətində deyillər. FPGA proqram təminatı, quraşdırılmış sistem şəkilləri və ya ixtisaslaşdırılmış ML model konteynerləri yaradan komanda, konteynerlərin işlədiyi hər yerdə yerləşdirilən standart OCI uyğun konteyner şəkillərini istehsal edərkən onların quruluşunu domenləri üçün məna kəsb edən terminlərlə təsvir edə bilər. Bu genişlənmə, daxiletmə formatını sabit kimi qəbul edən sistemlər üzərində əsl memarlıq üstünlüyüdür.

Provenance və SBOM: Post-SolarWinds Dünyası üçün Bina

Proqram təminatının təchizat zəncirinin təhlükəsizliyi 2020-ci ildə SolarWinds-in pozulması və 2021-ci ildə Log4Shell zəifliyindən sonra nəzəri narahatlıqdan şura səviyyəsində prioritetə keçdi. ABŞ hökumətinin kibertəhlükəsizlik üzrə 14028 saylı İcra Sərəncamı, 2021-ci ilin mayında, federal proqram təminatı müqavilələri üçün məcburi sənədlər. BuildKit-in mənşə sertifikatları və SBOM yaratma xüsusiyyətləri bu tənzimləmə və təhlükəsizlik mənzərəsinə birbaşa cavabdır.

--provenance=true--sbom=true bayraqları ilə BuildKit, konteyner şəklinə daxil olanları - hansı əsas şəkillərdən istifadə edildiyini, hansı Dockerfile təlimatlarının icra edildiyini, hansı mənbə fayllarının mövcud olduğunu və hansı xarici asılılıqların əldə edildiyini təsvir edən kriptoqrafik imzalanmış sertifikatlar yaradır. Bu sertifikatlar SLSA (Proqram Artefaktları üçün Təchizat Zənciri Səviyyələri) çərçivəsinə və in-toto attestasiya formatına uyğun olaraq onları Sigstore's Cosign və OPA (Açıq Siyasət Agenti) kimi siyasət mühərrikləri tərəfindən maşın tərəfindən yoxlanıla bilən edir.

Bunun imkan verdiyi praktik iş prosesi belə görünür:

  1. Developer kodu itələyir; CI boru kəməri mənşəyi aktivləşdirərək BuildKit quruluşunu işə salır.
  2. BuildKit bütün komponentləri və onların versiyalarını sadalayan imzalanmış SBOM yaradır.
  3. SBOM təsvir manifestinin yanında konteyner reyestrində dərc olunur.
  4. Kubernetes klasterindəki qəbul nəzarətçiləri yerləşdirməyə icazə verməzdən əvvəl mənşəyi yoxlayır.
  5. Zəiflik skannerləri yeni CVE-lər açıqlanan zaman təsirə məruz qalan şəkilləri müəyyən etmək üçün SBOM-u sorğulayır.

Bu tam boru kəmərini həyata keçirən komandalar zəifliklərin açıqlanmasına günlərlə deyil, saatlarla cavab verə bilər, çünki onların hər bir işləyən konteynerdə hər bir komponentin dəqiq, maşın tərəfindən oxuna bilən xəritəsi var. Mewayz kimi müştərilərin əməliyyat iş axınlarına dərindən inteqrasiya edən bizneslər üçün - əmək haqqı cədvəlinin idarə edilməsi, donanma məlumatlarının idarə edilməsi, hesab-fakturaların işlənməsi - ciddi, yoxlanıla bilən təchizat zəncirini nümayiş etdirmək bacarığı, sadəcə olaraq xoş bir şey deyil, getdikcə daha çox müəssisə satış danışıqları üçün ilkin şərtdir.

Başlamaq: Defolt Quraşdırmalardan Qabaqcıl Boru Kəmərlərinə

Son versiyadan istifadə edirsinizsə, BuildKit artıq Docker mühitinizdə işləyir — Docker 23.0 və daha sonra onu defolt olaraq aktivləşdirin. Əksər komandalar üçün ilk praktik addım, docker buildx alt əmri vasitəsilə BuildKit-in tam xüsusiyyətlərini ifşa edən Docker Buildx plaginini işə salmaqdır. docker buildx create --use proqramının icrası defolt sürücüdən daha çox qabiliyyətə malik BuildKit qurucu nümunəsini qurur. Buradan, hər şeyi bir anda qəbul etməyə çalışmaqdansa, təkmil funksiyaların tədricən mənimsənilməsi məntiqlidir.

Hazırda əsas docker build çağırışları ilə məşğul olan komanda üçün ağlabatan qəbul yolu əvvəlcə CI-yə keş ixracını əlavə etmək kimi görünür - bu, minimal konfiqurasiya dəyişikliyi ilə dərhal, ölçülə bilən sürət təkmilləşdirmələrini təmin edir. Komanda ARM infrastrukturunu hədəf almağa başlayanda çox platformalı qurğular dəyərli olur. Gizli montaj, şəxsi paket reyestrləri və ya SSH açarları quraşdırma kontekstində görünən istənilən vaxt qəbul etməyə dəyər. Uyğunluq tələbləri və ya müəssisə müştəri tələbləri təchizat zənciri sənədlərini zəruri etdikdə mənşə sertifikatlarının aktivləşdirilməsi məna daşıyır.

BuildKit-in daha dərin dərsi qəsdən qurmaqdır. Mikroservis, maşın öyrənməsinin son nöqtəsi və ya Mewayz-in 207 biznes modul dəsti kimi mürəkkəb platforma üçün konteyner göndərməyinizdən asılı olmayaraq, quraşdırma prosesi yerləşdirmə yolunda tələsdiyiniz formallıq deyil - bu, göndərilən hər şeyin keyfiyyətini, təhlükəsizlik vəziyyətini və əməliyyat yetkinliyini əks etdirən mühəndislik artefaktıdır. BuildKit sizə həmin artefaktı mükəmməl etmək üçün alətlər verir. Sual sadəcə olaraq onlardan istifadə etməyə vaxt ayırıb-almamağınızdır.

Tez-tez verilən suallar

BuildKit nədir və klassik Docker qurma sistemindən nə ilə fərqlənir?

BuildKit, Docker 18.09-da təqdim edilmiş və Docker 23.0-da defolt olan Docker-in yeni nəsil qurma mühərrikidir. Klassik qurucudan fərqli olaraq, BuildKit paralel təbəqənin icrasını, qabaqcıl keşləmə strategiyalarını, sirlərin quraşdırılmasını və platformalararası quruluşları dəstəkləyir. O, qurma prosesini yönləndirilmiş asiklik qrafik (DAG) kimi nəzərdən keçirir və mürəkkəb, çoxmərhələli Dockerfiles üçün daha ağıllı asılılıq həllini və dramatik şəkildə daha sürətli qurma vaxtlarını təmin edir.

Docker ilə BuildKit-dən istifadə etməyə başlamaq üçün əlavə nəsə quraşdırmalıyam?

Docker 23.0 və ya daha yenisini işlədirsinizsə, əlavə quraşdırma tələb olunmur — BuildKit defolt olaraq aktivdir. Köhnə versiyalarda siz qurma əmrlərinizi işə salmazdan əvvəl DOCKER_BUILDKIT=1 mühit dəyişənini təyin etməklə onu aktivləşdirə bilərsiniz. Uzaqdan qurma keşləri və ya çox platformalı qurğular kimi təkmil istifadə halları üçün docker buildx create-dan istifadə edərək xüsusi Buildx qurucu nümunəsini konfiqurasiya etmək istəyə bilərsiniz.

BuildKit standart konteyner təsvirlərindən kənar artefaktlar yaratmaq üçün istifadə edilə bilərmi?

Bəli və bu BuildKit-in ən çox qiymətləndirilməyən imkanlarından biridir. Fərdi ön hissələrdən və --output bayrağından istifadə edərək, BuildKit yalnız OCI şəkillərini deyil, xam binalar, tarballs, statik veb-saytlar və digər ixtiyari fayl artefaktları istehsal edə bilər. Bu, onu müxtəlif komandaların vahid alətlər silsiləsində fərqli çıxış formatlarına ehtiyac duyduğu poliqlot monorepolara və mürəkkəb CI boru kəmərlərinə təbii olaraq uyğun gələn ümumi təyinatlı quraşdırma mühərriki edir.

BuildKit Mewayz kimi alətlərlə yanaşı daha geniş DevOps platformasına necə uyğun gəlir?

BuildKit aşağı səviyyəli qurma təbəqəsini idarə edir, lakin müasir inkişaf qrupları həmçinin biznes iş axını, müştərilərin çatdırılması və əməliyyat proseslərini idarə etməlidir. Mewayz kimi platformalar — ayda 19 dollardan başlayan 207 modullu biznes ƏS — proqram təminatı biznesinin əməliyyat tərəfini əhatə etməklə infrastruktur alətlərini tamamlayır. BuildKit tərəfindən dəstəklənən səmərəli tikinti boru kəmərlərinin Mewayz kimi hamısı bir yerdə platforma ilə birləşdirilməsi komandalara kod artefaktından müştəri çatdırılmasına qədər tam bir yığın verir.