Hacker News

BuildKit: Скритият скъпоценен камък на Docker, който може да изгради почти всичко

Коментари

2 min read Via tuananh.net

Mewayz Team

Editorial Team

Hacker News

BuildKit: Скритият скъпоценен камък на Docker, който може да изгради почти всичко

Повечето разработчици познават Docker като среда за изпълнение на контейнера, която промени начина, по който софтуерът се доставя. Много по-малко знаят за двигателя, който тихо бръмчи под повърхността на всяка модерна компилация на Docker — BuildKit, системата за компилация от следващо поколение, която се доставя с Docker от версия 18.09 и стана бекенд по подразбиране в Docker 23.0. Докато инженерите спорят безкрайно относно конфигурациите на Kubernetes и моделите на микросервизи, BuildKit непрекъснато се развива в една от най-мощните, гъвкави системи за изграждане в екосистемата DevOps. Ако сте се отнасяли към него просто като към по-бързо докер изграждане, вие оставяте огромни възможности на масата. Компаниите, управляващи високопроизводителни CI/CD тръбопроводи, са съкратили времето за изграждане с 50–70% просто като разберат какво всъщност предлага BuildKit — и това е само началото.

Какво прави BuildKit фундаментално различен от класическия Builder

Оригиналният механизъм за изграждане на Docker изпълняваше инструкциите на Dockerfile последователно, един слой в даден момент, без да знае каква работа може безопасно да се извърши паралелно. BuildKit заменя този линеен модел на изпълнение с насочена ациклична графика (DAG) — графика на зависимост, която разбира кои стъпки на изграждане разчитат една на друга и кои не. Независимите етапи се изпълняват едновременно, неизползваните етапи се пропускат изцяло и цялата компилация се превръща в декларативно описание на това, което искате, а не в императивна последователност от стъпки, които трябва да цитирате в правилния ред.

Тази архитектурна промяна има практически последици, които надхвърлят скоростта. Когато многоетапен Dockerfile компилира Go двоичен файл на един етап, изтегля зависимостите на Node.js на друг и сглобява производствено изображение на трети, BuildKit може да изпълни първите два етапа едновременно. Компилация, която преди отнемаше четири минути на мощен CI runner, сега завършва за под деветдесет секунди. Stripe, Shopify и десетки други високомащабни инженерни екипи са документирали подобни печалби в техните ретроспективи за вътрешни инструменти. DAG моделът също така означава, че BuildKit може да генерира много точни метаданни за компилация – основа за функции като атестации за произход и генериране на софтуерни спецификации (SBOM), които имат огромно значение за сигурността на веригата за доставки.

Съществува и концептуална промяна в начина, по който работи анулирането на кеша. Класическият конструктор анулира всеки слой под всяка променена инструкция. BuildKit проследява хешовете на съдържанието при всеки вход, така че промяната на коментар в Dockerfile не изтрива запис в кеша, който представлява тридесет минути компилация. Когато вашият кеш за компилация е разликата между петминутен и четиридесетминутен цикъл на обратна връзка за вашия инженерен екип, тази прецизност има много по-голямо значение, отколкото може да изглежда първоначално.

Мултиплатформени компилации: една команда, всяка архитектура

Флагът --platform на

BuildKit и интеграцията на QEMU трансформират това, което някога беше болезнен проблем за многосистемна координация, в една команда. Изпълнението на docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 . произвежда три готови за производство изображения паралелно от едно извикване на компилация. Тази възможност стана критична, тъй като индустрията се измества към ARM — екземплярите на AWS Graviton3 постоянно осигуряват 40% по-добра цена-производителност при работни натоварвания като уеб обслужване и обработка на данни, а Apple Silicon направи ARM машината за разработка по подразбиране за милиони инженери.

Преди мултиплатформената поддръжка на BuildKit да узрее, поддържането на отделни конвейери за изграждане за различни архитектури беше истински разходен център. Екипите или поддържаха множество Dockerfiles, изпълняваха отделни CI тръбопроводи на различни архитектури, или просто изпращаха x86 изображения навсякъде и плащаха наказанието за производителност на ARM инфраструктура. С BuildKit вие дефинирате своята компилация веднъж и оставяте системата да обработва прозрачно специфичната за архитектурата компилация. Rust проекти, които изискват кръстосано компилиране, Go проекти с CGO зависимости, Python пакети с C разширения — BuildKit обработва емулационния слой, без да изисква да разбирате подробностите за всяка целева платформа.

Практическата бизнес стойност тук е измерима. Екип, работещ с 200 контейнера на инстанции на AWS Graviton при $0,04 на vCPU-час спрямо еквивалентния x86 екземпляр при $0,056 на vCPU-час, спестява приблизително $11 520 годишно на 100 vCPU-та — чисто от избора на правилната архитектура. Правенето на този избор достъпен без усилия за реинженеринг е точно вид оптимизация на инфраструктурата, която се изплаща веднага.

Тайно управление без изтичане в слоеве на изображения

Една от най-недооценените функции на BuildKit е неговият API за тайни. Класическият създател на Docker нямаше чист начин да предаде идентификационни данни в компилация, без тези идентификационни данни потенциално да се озоват в слой с изображение. Разработчиците заобиколиха това с многоетапни компилации, ARG инструкции и внимателно подреждане — но рискът от случайно запичане на API ключ или частен SSH ключ в изпратено изображение остава неприятно висок. Скенерите за сигурност рутинно откриват твърдо кодирани идентификационни данни в изображения на контейнери, публикувани в публични регистри, и много от тези изтичания се проследяват директно обратно до неумело боравене с тайна по време на компилации.

Флагът --secret на

BuildKit монтира чувствителни данни в средата за компилиране като временна пътека на файловата система, която съществува само за продължителността на конкретната инструкция RUN, която се нуждае от нея, и никога не докосва нито един слой на изображението. Инструкция на Dockerfile като RUN --mount=type=secret,id=npmrc cat /run/secrets/npmrc > ~/.npmrc && npm install дава на процеса на компилация достъп до частни идентификационни данни за npm, без тези идентификационни данни изобщо да се появяват в крайното изображение или който и да е междинен слой. Същият модел работи за идентификационни данни на PyPI, настройки на Maven, SSH ключове за частни Git хранилища и всеки друг чувствителен материал, който вашият процес на изграждане изисква.

За екипи, изграждащи софтуер, който засяга регулирани индустрии – платформи за здравеопазване, финтех продукти, софтуер за човешки ресурси – разликата между „идентификационните данни може да са в изображението“ и „идентификационните данни доказано не могат да бъдат в изображението“ е разликата между преминаването на одит на сигурността и прекарването на три седмици в коригиране на констатациите. Платформи като Mewayz, които захранват бизнес операциите за над 138 000 потребители в индустрии като заплати, човешки ресурси и фактуриране, зависят точно от този вид доказуема позиция на сигурност в своите канали за изграждане и внедряване, за да поддържат доверието, което тези клиенти оказват на техните чувствителни финансови и лични данни.

Експортиране на кеша: Направете CI тръбопроводите наистина бързи

CI тръбопроводите са мястото, където производителността на изграждането има най-голямо значение и където опитът с изграждането на Docker по подразбиране в миналото е бил най-болезнен. Новите CI runners обикновено започват с празни кешове, което означава, че всяко изпълнение на конвейер компилира отново всичко от нулата. За услуга на Java със стотици зависимости на Maven, проект на Rust или приложение на Python с тежки собствени разширения, това означава време за изграждане, измерено в десетки минути, а не в секунди. Бизнес цената на бавния CI е огромна — намалена честота на внедряване, по-дълги вериги за обратна връзка и бездействащи инженери, чакащи конвейерите да завършат, преди да могат да се слеят и да продължат напред.

Функцията за експортиране на кеша на BuildKit решава това с експортируеми кеш манифести. С помощта на --cache-to type=registry,ref=myregistry/myapp:cache и --cache-from type=registry,ref=myregistry/myapp:cache, BuildKit изпраща подробна моментна снимка на кеша в регистър след всяка компилация и я изтегля в началото на следващата. Кешът е адресиран по съдържание, така че само наистина променени слоеве се извличат повторно. Екипите, използващи този модел в GitHub Actions, GitLab CI и CircleCI, рутинно съкращават времето за конвейер от петнадесет минути до под три при последващи изпълнения. Собствената документация на GitHub за усъвършенствани работни процеси за изграждане на Docker силно препоръчва този модел точно поради тази причина.

<блоков цитат>

Най-бързата компилация е тази, която никога повече не трябва да изпълнявате. Многослойната, адресирана към съдържанието кеш система на BuildKit не просто ускорява компилациите — тя прави цялата концепция за „компилация“ по-интелигентна, превръщайки повтарящата се компилация в постепенна разлика на точно това, което се е променило.

Експортирането на кеша също се интегрира чисто с работните потоци за разработка, базирани на клонове. Можете да конфигурирате вашия CI тръбопровод да се върне от специфичен за клон кеш към основния кеш за клон, когато не съществува кеш за клон, което означава, че новите клонове незабавно се възползват от топлия кеш, натрупан от вашата основна линия за разработка. Инженерите получават бърза обратна връзка от първия си ангажимент на нов клон, вместо да чакат наказание за студен старт.

💡 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: Изграждане отвъд Dockerfiles

Може би най-малко известната възможност на BuildKit е, че Dockerfiles са само един възможен входен формат — не единственият. BuildKit има pluggable frontend архитектура, която позволява изцяло персонализирани езици и формати за дефиниране на компилация. Предният интерфейс се определя от директивата # syntax= в горната част на вашия файл за компилация, която казва на BuildKit да изтегли конкретно изображение на предния интерфейс и да го използва за анализиране и изпълнение на останалата част от файла.

Тази архитектура даде възможност за няколко завладяващи проекта. Интеграцията на Buildpacks позволява на BuildKit да създава изображения на контейнери от изходния код на приложението без изобщо Dockerfile — той открива езика, избира подходящи базови изображения и автоматично сглобява готов за производство контейнер. HPC и научните компютърни общности са използвали персонализирани интерфейси, за да опишат компилации на специфични за домейн езици, които се компилират до вътрешното LLB (изграждане на ниско ниво) представяне на BuildKit. Предният интерфейс на синтаксиса на docker/dockerfile:labs експериментира с функции като поддръжка на heredoc, контрол на --network за всяка инструкция и подобрени съвети за кеша, преди да се приземят в стабилен синтаксис на Dockerfile.

Възможността да дефинирате свой собствен фронтенд също така означава, че организациите с необичайни изисквания за изграждане не трябва да избират между „включване на всичко в синтаксиса на Dockerfile“ и „изцяло изоставяне на контейнерите“. FPGA фърмуер за изграждане на екип, изображения на вградени системи или специализирани контейнери за модели на ML могат да опишат своята конструкция с термини, които имат смисъл за техния домейн, като същевременно произвеждат стандартни OCI-съвместими изображения на контейнери, които внедряват навсякъде, където се изпълняват контейнери. Тази разширяемост е истинско архитектурно предимство пред системите за изграждане, които третират входния си формат като фиксиран.

Произход и SBOM: Сграда за света след SolarWinds

Сигурността на веригата за доставки на софтуер се премести от теоретична загриженост към приоритет на ниво борд след пробива на SolarWinds през 2020 г. и уязвимостта на Log4Shell през 2021 г. Изпълнителна заповед 14028 на правителството на САЩ относно киберсигурността, издадена през май 2021 г., наложи разписка за софтуера за федерални изпълнители. Атестациите за произход на BuildKit и функциите за генериране на SBOM са пряк отговор на този регулаторен и защитен пейзаж.

С --provenance=true и --sbom=true флагове BuildKit генерира криптографски подписани атестации, които описват точно какво е влязло в изображение на контейнер – кои базови изображения са използвани, кои инструкции на Dockerfile са изпълнени, кои изходни файлове са присъствали и какви външни зависимости са били извлечени. Тези атестации следват рамката SLSA (Нива на веригата за доставки за софтуерни артефакти) и формата на атестация in-toto, което ги прави машинно проверяеми от механизми за правила като Cosign на Sigstore и OPA (Агент за отворена политика).

Практическият работен процес, който това позволява, изглежда така:

  1. Програмистът избутва код; CI тръбопроводът задейства изграждане на BuildKit с активиран произход.
  2. BuildKit генерира подписан SBOM, изброяващ всички компоненти и техните версии.
  3. SBOM се публикува в регистъра на контейнера заедно с манифеста на изображението.
  4. Контролери за достъп в клъстера Kubernetes проверяват произхода, преди да разрешат внедряването.
  5. Скенерите за уязвимости отправят запитване към SBOM, за да идентифицират засегнатите изображения, когато се разкрият нови CVE.

Екипите, които внедряват този пълен конвейер, могат да отговорят на разкриване на уязвимости за часове, а не за дни, защото имат точна, машинно четима карта на всеки компонент във всеки работещ контейнер. За фирми като Mewayz, които се интегрират дълбоко в оперативните работни потоци на клиентите – текуща ведомост, управление на данни за автопарка, обработка на фактури – способността да се демонстрира стриктна, подлежаща на одит верига на доставки е все по-предпоставка за разговори за корпоративни продажби, а не просто нещо хубаво за притежаване.

Първи стъпки: От компилации по подразбиране до разширени конвейери

BuildKit вече работи във вашата Docker среда, ако използвате скорошна версия — Docker 23.0 и по-късно я активирайте по подразбиране. Първата практическа стъпка за повечето екипи е активирането на приставката Docker Buildx, която разкрива пълния набор от функции на BuildKit чрез подкомандата docker buildx. Изпълнението на docker buildx create --use настройва екземпляр на BuildKit builder с повече възможности от драйвера по подразбиране. Оттам нататък постепенното приемане на разширени функции има смисъл, вместо да се опитвате да приемете всичко наведнъж.

Разумният път на приемане за екип, който понастоящем прави основни извиквания на docker build, изглежда като добавяне на експортиране на кеша към CI първо — това осигурява незабавни, измерими подобрения на скоростта с минимална промяна на конфигурацията. Мултиплатформените компилации стават ценни, когато екипът започне да се насочва към ARM инфраструктура. Тайното монтиране си струва да се приеме всеки път, когато частни регистри на пакети или SSH ключове се появят в контекста на изграждането. Атестациите за произход имат смисъл да се активират, когато изискванията за съответствие или изискванията на корпоративните клиенти налагат документация за веригата за доставки.

По-дълбокият урок от BuildKit е за умишленото изграждане. Независимо дали изпращате контейнер за микроуслуга, крайна точка за извод за машинно обучение или сложна платформа като пакета от 207 бизнес модула на Mewayz, процесът на изграждане не е формалност, през която бързате по пътя към внедряването – това е инженерен артефакт, който отразява качеството, позицията на сигурност и оперативната зрялост на всичко, което излиза от него. BuildKit ви дава инструментите, за да направите този артефакт отличен. Въпросът е просто дали отделяте време да ги използвате.

Често задавани въпроси

Какво е BuildKit и как се различава от класическата система за изграждане на Docker?

BuildKit е машината за изграждане на Docker от следващо поколение, въведена в Docker 18.09 и станала стандартна в Docker 23.0. За разлика от класическия конструктор, BuildKit поддържа изпълнение на паралелен слой, разширени стратегии за кеширане, монтиране на тайни и крос-платформени компилации. Той третира процеса на изграждане като насочена ациклична графика (DAG), което позволява по-интелигентно разрешаване на зависимости и драматично по-бързо време за изграждане за сложни, многоетапни Docker файлове.

Трябва ли да инсталирам нещо допълнително, за да започна да използвам BuildKit с Docker?

Не е необходима допълнителна инсталация, ако използвате Docker 23.0 или по-нова версия — BuildKit е активиран по подразбиране. В по-стари версии можете да го активирате, като зададете променливата на средата DOCKER_BUILDKIT=1, преди да изпълните вашите команди за компилация. За случаи на усъвършенствана употреба, като кеширане на отдалечени компилации или мултиплатформени компилации, може да пожелаете да конфигурирате специален екземпляр на Buildx buildr с помощта на docker buildx create.

Може ли BuildKit да се използва за изграждане на артефакти извън стандартните контейнерни изображения?

Да, и това е една от най-недооценените възможности на BuildKit. Използвайки потребителски интерфейси и флага --output, BuildKit може да произвежда необработени двоични файлове, tarballs, статични уебсайтове и други произволни файлови артефакти — не само OCI изображения. Това го прави машина за изграждане с общо предназначение, която се вписва естествено в полиглот монорепо и сложни CI тръбопроводи, където различни екипи се нуждаят от различни изходни формати от унифицирана верига от инструменти.

Как BuildKit се вписва в по-широка платформа DevOps заедно с инструменти като Mewayz?

BuildKit управлява слоя за изграждане на ниско ниво, но съвременните екипи за разработка също трябва да управляват бизнес работни потоци, доставка на клиенти и оперативни процеси. Платформи като Mewayz — бизнес операционна система с 207 модула, започваща от $19/месец — допълват инфраструктурните инструменти, като покриват оперативната страна на софтуерния бизнес. Сдвояването на ефективни конвейери за изграждане, захранвани от BuildKit с платформа „всичко в едно“ като Mewayz, дава на екипите пълен стек от артефакт на код до доставка на клиента.

.

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

Start managing your business smarter today

Join 30,000+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime