Налаштування Docker BuildKit для оптимізації збірки

Збірка образів розтягується на хвилини, викладка гальмує, а релізи чекають усі. Ми налаштовуємо Docker BuildKit під ключ: розбираємо схему збірки, вмикаємо повторне використання шарів і паралельні кроки, передаємо регламент вашій команді. Результат — збірка в рази швидша й передбачувана викладка без відмов.
Часті запитання

Збірка образів впирається в хвилини: де вузьке місце

Налаштування Docker BuildKit починається з чесної відповіді на питання, чому повторна збірка проєкту триває хвилинами, хоча в коді змінився один файл.

Причина майже завжди одна: повторне використання шарів не працює — кеш скидається на першій же інструкції, і всі наступні кроки виконуються заново.

Зверху лягає послідовна обробка етапів: поки не завершиться встановлення залежностей, компіляція навіть не почнеться, хоча ці кроки одне від одного не залежать. Довга збірка образів сприймається як норма рівно до моменту, коли рахуєш, скільки часу йде на це за тиждень.

Друге джерело — розмір контексту збірки. Якщо в каталог потрапляють журнали, локальні артефакти, каталоги залежностей і тимчасові файли, кожен запуск заново передає їх у службу збірки, і час іде на передавання, а не на роботу.

Нарешті, локальна та серверна збірка розходяться: на машині розробника кеш прогрітий, у середовищі збірки він порожній, і той самий образ збирається за секунди локально й за хвилини на сервері.

Ця розбіжність маскує вузьке місце збірки — його шукають у коді, а воно в конфігурації та порядку кроків.

Ціна передбачувана: очікування в черзі на здачу, рідкісні релізи, звичка «збирати рідше і відразу всім», а відкат на попередню версію перетворюється на окрему операцію зі своїми ризиками. Далі розбираємо, як це закривається.

Повторне використання шарів і паралельні кроки: що це дає

Скорочення часу повторної збірки

Повторна збірка після правки одного рядка перестає перезбирати весь образ: шари із залежностями повторно використовуються, перезбирається лише змінений крок. Паралельні кроки — встановлення пакетів, лінтери, компіляція — виконуються одночасно, а не вишиковуються в чергу.

На типовому сервісі повторна збірка скорочується з десятків хвилин до однієї-двох. За публічними вимірами Docker BuildKit частка повторно використовуваних шарів на повторних запусках перевищує 80%. Чим частіше викладаєте, тим сильніший ефект: очікування збірки перестає стримувати релізи.

Менше розбіжностей між локальною та серверною збіркою

Інструкції виконуються в однаковому середовищі на машині інженера та на вузлі збірки: версії інструментів, змінні середовища й змонтовані кеші зафіксовані в конфігурації, а не в домовленостях між людьми. Помилка «локально збирається, на сервері падає» переходить із регулярних у рідкісні.

Єдиний процес збірки дає відтворюваний артефакт: перевірений на стенді образ потрапляє в продакшен тим самим шляхом. Стабільність викладки зростає завдяки повторюваності, а не завдяки ручним перевіркам перед кожним релізом — і це стабільно прискорює весь ланцюжок викладки.

Docker BuildKit налаштування: режими збірки і що вибрати

Вибір режиму збірки — це не «увімкнути BuildKit», а вирішити, де живе стан: шари, проміжні артефакти й залежності.

Один і той самий образ збирається за хвилини або за десятки хвилин — різниця в тому, наскільки повторна збірка потрапляє в уже готові шари й як поводиться конвеєр, коли кеш недоступний.

Нижче — чотири режими, між якими реально обирають, та їхні обмеження.

Варіант Коли підходить Обмеження
Звичайна збірка Разовий образ на одній гілці, вимог до часу збірки немає Кожен запуск перезбирає шари заново; повторні збірки тривають стільки ж, скільки перша
Повторне використання шарів між запусками Часті релізи однієї гілки, збірки на одному виконавці або зі спільним диском Кеш прив’язаний до машини: переїзд на інший виконавець — прогрів з нуля; сховище зростає без очищення
Спільний кеш між гілками та виконавцями Кілька команд, паралельні збірки, повторювані залежності Потрібне зовнішнє сховище й політика витіснення; вищі вимоги до розмежування доступів
Збірка на окремій машині Різні архітектури, важкі збірки, ізоляція ресурсів вузла збірки Вузол потрібно оновлювати й моніторити; контекст передається мережею, додаються накладні витрати

Обмеження спільного кешу між гілками

Ключ шару обчислюється від вмісту інструкції та вхідних файлів, тому гілки з розбіжними кроками шари не розділяють — виграш отримують насамперед ті, хто часто збирає близькі ревізії.

Далі починається гігієна: без політики витіснення сховище зростає швидше, ніж скорочується час збірки, а секрети, що потрапили в шар, роздаються разом із кешем усім, хто має до нього доступ.

Окремо перевіряємо деградацію — при недоступному сховищі збірка повинна доходити до кінця у звичайному режимі, а не падати.

Налаштування за кроками: від аудиту збірки до передачі регламенту

Починаємо з вимірювання, а не з правки конфігурації: прискорена збірка без аудиту дає приріст на чистому репозиторії та розвалює кеш на реальних змінах. Порядок однаковий і для одиночного сервісу, і для монорепозиторію з десятком образів.

  1. Аудит збірки. Знімаємо базові значення: час повної та інкрементальної збірки, розмір образу, частка кроків, що потрапили в кеш, і що найчастіше його скидає — порядок копіювання, встановлення залежностей після коду, відсутність .dockerignore.
  2. Схема збірки: шари та стадії. Розкладаємо процес на стадії, визначаємо спільну базу, місця для монтування кешу пакетних менеджерів і шари, які переживають перезбирання без змін.
  3. Налаштування виконавців збірки та прав. Вирішуємо, де працює демон — на виділеному вузлі, в контейнері або в режимі без прав суперкористувача, — і видаємо мінімально достатні доступи до реєстру.
  4. Увімкнення режиму. Правимо конфігурацію демона й файл збірки, налаштовуємо вивезення кешу в реєстр, щоб він повторно використовувався не лише на одній машині.

Перевірка результату на бойових репозиторіях

  • Перевірка результату збірки. Проганяємо на двох-трьох реальних репозиторіях, порівнюємо з базовими значеннями за часом і потраплянням у кеш, переконуємося, що попередній спосіб збірки залишається робочим для відкату.
  • Передача регламенту. Віддаємо команді опис схеми, шаблон файлу збірки, правила роботи з кешем і оновлення базових образів, перелік метрик для чергування.

Файли конфігурації, схеми та регламенти збірки

Підсумок роботи — не лише швидка збірка, а й пакет артефактів, за яким команда відтворює її без нас. Усе лежить у репозиторії поруч із кодом, проходить рев’ю як звичайна зміна й версіонується разом із релізом.

  • Файл конфігурації збірки — увімкнені режими, ліміти паралелізму, політика кешування; до кожного параметра коментар, чому вибрано саме його.
  • Схема шарів і кроків — що потрапляє в спільний шар, що перезбирається при правці коду, де проходять межі кешу й чому.
  • Правила доступу до сховища образів — ролі, строк життя облікових даних, хто може публікувати, перезаписувати тег і видаляти образи.
  • Опис обмежень — що збірка свідомо не робить і які умови її ламають, щоб команда не чекала зайвого.
  • Регламент випуску — послідовність від коміту до готового образу, точки перевірок і умови зупинки.
  • Інструкція з відновлення збірки — як підняти її з нуля при втраті кешу, звідки беруться базові шари, як відкотитися на попередній образ.
  • Чек-ліст приймання — набір перевірок, за якими правка конфігурації вважається безпечною.
  • Карта передачі знань — запис розбору з командою та відповіді на питання, що виникли по ходу.

Що команда зможе змінювати самостійно

Далі правки вносяться без нас: змінити ліміти паралелізму, додати крок, перебудувати порядок шарів, підключити новий сервіс до сховища. Регламент прямо каже, які зміни безпечні, а які потребують перезбирання базового шару й тому робляться окремим випуском.

Якщо щось пішло не так, інструкція з відновлення повертає робочу збірку за один прохід. Ми залишаємося на зв’язку на час супроводу, але точка неповернення не створюється: команда володіє конфігурацією й розуміє її логіку.

Кейс: час збірки скоротили в рази, відмови викладки зникли

Замовник — продуктова команда з багатосервісним репозиторієм і спільною базою образів. Повна збірка займала 18 хвилин, повторна після правки одного сервісу — 11: розробник чекав результат довше, ніж писав код.

Викладка зривалася кілька разів на місяць через розбіжності між локальним і складальним середовищем.

Заміри знімали на їхньому стенді за логами збірки, без синтетичних сценаріїв: будь-яка правка в такій структурі тягла перезбирання майже всього.

Метрика До Після
Повна збірка 18 хв 4 хв
Повторна збірка після правки сервісу 11 хв близько 1 хв
Частка повторно використаних шарів 20% 85%
Зривів викладки на місяць 7 0
Повернення до робочого стану 40 хв 3 хв

Що зробили всередині процесу збірки

Перевели збірку на Docker BuildKit, щоб проміжні шари жили між запусками, а не створювалися заново. Стадії розділили: залежності, тести, артефакт, фінальний образ — правка коду зачіпає лише останні.

Кеш винесли в спільний том на вузлі збірки з явним режимом зберігання: він переживає окремі завдання й доступний паралельним збіркам.

Базові образи фіксуємо за дайджестом, а конфігурацію збірки перевіряємо до викладки — розбіжність між локальною та серверною збіркою більше не доходить до бойового контуру.

Зривів викладки не залишилося, а повернення до робочого стану займає хвилини: відкат повторно використовує незмінені шари. Заміри знято з логів збірки — вивантаження й схему стадій передали команді замовника.

Що робити, якщо збірка вже працює і ламати її не можна?

Так — перехід робиться паралельною схемою, а не заміною «в один день».

Режим збірки BuildKit вмикається окремо на рівні демона й окремо для конкретного проєкту, тому новий конвеєр і чинний можуть працювати одночасно: частина сервісів збирається як раніше, поки в їхній конфігурації не з’явиться новий прапорець.

Практика така: поруч піднімаємо другий агент збірки на новій схемі, він читає ті самі репозиторії та надсилає в той самий реєстр образів. Потім переводимо на нього один-два некритичні сервіси й порівнюємо час збірки, розмір образу та частку потраплянь у кеш — до і після. Розширюємо список проєктів лише після того, як цифри зійшлися.

Перед увімкненням усе проганяється на копії: розгортаємо реєстр-дубль, піднімаємо копію конвеєра й збираємо на ній поточні релізи. Це дешевше, ніж з’ясовувати на продакшені, що багатоетапна збірка з монтуванням кешу конфліктує з рештою старих агентів.

Ризики передбачувані й відомі заздалегідь. Новий кеш не читається попереднім, тому перший прогін збирає шари заново — під це резервуємо запас за часом і навантаженням на агенти.

Секрети, що прийшли через монтування, не повинні осісти в шарах образу: у Docker це розділено за типами монтування, і при перенесенні ми звіряємося з офіційною документацією щодо режимів збірки.

Відкат — одна команда: агент перемикається на попередній режим, старий кеш залишається теплим, повного перезбирання не буде. Саме тому увімкнення робиться поетапно й без вікна простою.

Обмеження, сумісність і типові технічні питання

Сумніви перед увімкненням нового збирача зазвичай стосуються не самого налаштування, а його наслідків: ресурсів, сумісності зі старими сценаріями, доступів і відкату. Розбираємо п’ять питань, які задають до старту.

Наскільки зросте навантаження на сервер збірки?

Збирач тримає службовий процес і локальний кеш, тому пікове споживання диска й пам’яті на виконавці вище, ніж при звичайній збірці. Зате повторні збірки повторно використовують шари й проходять швидше, а розмір кешу обмежується політикою зберігання та правилами очищення.

Які вимоги до виконавців і серверів збірки?

Потрібні підтримка ізоляції на рівні ядра, окремий обліковий запис і права на запуск службового процесу. Виконавці об’єднуються в групу зі спільним кешем — тоді важкі шари збираються один раз, а не на кожній машині.

Чи доведеться переписувати скрипти збірки?

Ні. Наявні інструкції залишаються робочими, збирач вмикається параметром або змінною середовища. Переписувати варто лише порядок копіювання контексту й багатоетапну збірку — саме там з’являється основний виграш за часом.

Що з ізоляцією даних і доступами?

Кожна збірка йде у своєму просторі імен, секрети підключаються на час кроку й не осідають у шарах образу. Кеш спільний, тому до нього допускаються лише довірені гілки — інакше через нього можна винести проміжні артефакти.

Як відкотитися, якщо щось піде не так?

Відкат — це перемикання способу збірки назад, одне налаштування в конфігурації виконавця. Образи в реєстрі не перезаписуються, тому попередній реліз залишається доступним і розгортається за хвилини.

Обговоримо завдання: надішліть схему збірки та обмеження

Щоб повернутися з оцінкою та планом робіт, а не із загальними міркуваннями, нам потрібні вихідні дані для оцінки.

Налаштування Docker BuildKit спирається на те, як влаштований ваш конвеєр сьогодні: де живе кеш шарів, що потрапляє в контекст збірки, які кроки перезбираються при правці одного рядка. Опишіть завдання — зберемо картину й запропонуємо порядок змін.

  • Схема поточної збірки: які образи збираються, на яких агентах, із яких базових шарів, чим запускається збірка зараз.
  • Склад проєктів: один репозиторій чи кілька, чи є спільні базові образи й хто від них залежить.
  • Вузькі місця: що саме гальмує — встановлення залежностей, компіляція, вивантаження образу в реєстр, повторна збірка при незмінному коді.
  • Вимоги до строків випуску: скільки збірок на день, за який час потрібен готовий артефакт, чи важлива швидкість на гілці розробки окремо від релізної.
  • Обмеження за доступами: куди відкрито шлях агентам збірки — внутрішній реєстр, дзеркала пакетів, приватні залежності.
  • Інфраструктурні межі: свої машини чи керовані агенти, скільки місця можна віддати під кеш і де він повинен переживати перезапуск.
  • Інваріанти: політики безпеки, перевірки артефактів, вимоги до відтворюваності збірки та можливості відкату на попередній реліз.

З цим набором ми назвемо, які зміни дадуть ефект у першу чергу, а які можна відкласти, і зафіксуємо межі робіт за строками. Опишіть завдання у зручному вигляді — повернемося з оцінкою та планом.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139