Налаштування Buildah для збірки OCI-образів без Docker

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

Buildah: збірка OCI-образів без демона та прав суперкористувача

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

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

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

Buildah знімає цю залежність: збірка OCI-образів без Docker іде окремими процесами без довгоживучого демона, тому не потрібно ні прокидати сокет, ні тримати на вузлі постійно працюючу привілейовану службу.

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

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

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

Що дає збірка образів без привілейованого демона

Збірка без привілейованого демона йде від імені звичайного користувача: Buildah збирає образ в ізольованому просторі імен, без доступу до сокета і без прав root на вузлі.

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

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

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

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

Один і той самий коміт дає ідентичний набір шарів на будь-якій машині — від робочої станції розробника до вузла збірки, тому розбіжність «локально працює» перестає бути окремим класом проблем.

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

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

Де доречний Buildah: порівняння режимів збірки

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

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

Варіант Коли підходить Обмеження
Локальна збірка Налагодження Containerfile, швидкий цикл правок до коміту Результат залежить від машини і версій пакетів, відтворюваність не гарантується
Збірка в конвеєрі, rootless Релізні образи, однаковий результат на кожному запуску Потребує налаштування підпорядкованих UID/GID і прав на сховище; частина привілейованих інструкцій не відпрацює
Ізольована збірка Недовірений базовий образ, фіксація оточення і мережевих правил Мережа за замовчуванням закрита, збірка йде повільніше на 15–25%
Збірка зі спільним кешем шарів Довгі збірки з важкими залежностями Кеш потрібно чистити за розкладом, інакше диск зростає; зміна базового шару перезбирає все заново

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

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

Як відбувається впровадження збірки на Buildah

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

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

  1. Обстеження збірок. Збираємо інвентар: які образи випускаються, з яких базових шарів, де збірка звертається до мережі, секретів і прав root. На виході — карта залежностей і список місць, які не можна переносити «як є».
  2. Цільова схема. Визначаємо, що залишається в одному описі, що виноситься в багатоетапну збірку, які шари кешуються між релізами і які перевірки обов'язкові до публікації.
  3. Перенесення описів. Переписуємо інструкції під нові команди і монтування, прибираємо кроки, які трималися на демоні. Кожен образ проходить звірку складу: ті самі пакети, той самий користувач, той самий набір файлів.
  4. Перевірка відтворюваності. Дві збірки одного і того самого вихідного коду мають збігтися за складом і контрольною сумою. Розходиться — шукаємо неявні залежності: оновлення пакетів з мережі, порядок шарів, мітки часу.
  5. Прогін на конвеєрі. Підключаємо збірку до конвеєра випуску і дивимося час збірки, публікацію в реєстр і відкат на попередній образ.
  6. Передача і регламент. Документуємо, як додати образ, оновити базовий шар і що робити при розбіжності збірок.

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

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

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

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

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

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

Кейс: як збірка образів перестала залежати від привілеїв

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

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

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

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

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

Метрики до і після: повний прогін скоротився приблизно з дванадцяти хвилин до чотирьох — позначилося перевикористання незмінених шарів і паралельна збірка.

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

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

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

Чим відрізняється збірка без демона від класичної збірки?

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

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

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

Збірка без служби йде під непривілейованим користувачем, кожне завдання отримує свій простір, а спільний сокет перестає бути обов'язковим для роботи.

Варіант Коли підходить Обмеження
Класична збірка через службу Локальна розробка, де потрібен спільний кеш шарів і звичні команди Потребує постійно працюючого процесу і привілеїв; спільна точка доступу розширює поверхню ризику
Збірка без демона Завдання безперервного постачання, непривілейована збірка, агенти на спільних машинах Немає звичного програмного інтерфейсу служби — скрипти збірки і публікації потрібно перевести на новий інструмент
Гібридна схема Поступовий перехід: збірка без служби, публікація і локальний запуск — колишнім інструментом Два шляхи обслуговування і різні кеші: поки живуть обидва, потрібно стежити за розбіжністю базових образів

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

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

Сумніви інженерів: кеш, приватні реєстри, сумісність

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

Чи прочитає інструмент наші описи збірки?

Синтаксис Dockerfile і Containerfile розбирається одним парсером: багатоетапні збірки, ARG, COPY, heredoc і зазначення платформи працюють без переписування.

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

Як бути із закритими реєстрами?

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

Чи збережеться кеш шарів між збірками?

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

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

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

Обговоримо завдання: що уточнити перед стартом робіт зі збірки

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

  • Збіркові описи і скрипти: чинні Dockerfile, entrypoint, кроки завдань — за ними видно, які інструкції перестають працювати при збірці без демона.
  • Цільові реєстри і доступи: адреси сховищ, окремі облікові записи на читання базових шарів і запис результату, вимоги до підпису образів.
  • Матриця платформ: для яких архітектур збираємо і чи потрібна мультиархітектурна збірка — на одному вузлі або розподілено.
  • Базові образи: дозволені джерела і внутрішні дзеркала, вимоги до мінімального складу пакетів і оновлення уразливостей.
  • Середовище збірки: ранери без прав root, доступ у мережу, ліміти процесора і диска, вимоги до кешу шарів між запусками.
  • Політика тегів і зберігання: схема версіонування, правила очищення реєстру, глибина відкату на попередні релізи.
  • Середовище деплою: кластер або окремі хости, перевірки працездатності, вимоги до відкату на попередню версію.

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

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

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

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