Локально збирання швидке завдяки кешу шарів. У CI (GitHub Actions, GitLab CI) раннер зазвичай одноразовий: кожен запуск починається з порожнього кешу, і composer install, npm ci, встановлення розширень PHP виконуються щоразу заново.
BuildKit уміє експортувати кеш у зовнішнє сховище й імпортувати його в наступному запуску:
docker buildx build \
--cache-from type=registry,ref=ghcr.io/acme/app:buildcache \
--cache-to type=registry,ref=ghcr.io/acme/app:buildcache,mode=max \
-t ghcr.io/acme/app:sha-a1b2c3d --push .
Бекенди кешу:
| Бекенд | Де зберігається |
|---|---|
inline |
у самому образі (лише кеш фінального етапу) |
registry |
окремий образ-кеш у реєстрі |
local |
каталог на диску |
gha |
кеш GitHub Actions |
s3, azblob |
об'єктне сховище |
mode=min чи mode=max:
min(за замовчуванням) - кеш лише шарів, що потрапили у фінальний образ. Проміжні етапи multi-stage (встановлення Composer-залежностей, збирання фронтенду) не кешуються;max- кеш усіх етапів. Для multi-stage збирань саме він дає найбільший виграш, ціною більшого розміру кешу.
GitHub Actions:
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v6
with:
push: true
tags: ghcr.io/acme/app:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
Кеш GitHub Actions має обмеження розміру на репозиторій - старі записи витісняються. Для великих образів надійніший кеш у реєстрі.
Що враховувати:
- cache mounts не експортуються цими бекендами - вони живуть лише на конкретному збирачі. У CI їх роль виконує саме експортований кеш шарів;
- кеш для гілок: окремі ключі кешу для
mainі гілок (ref=...:buildcache-${branch}) з імпортом кешуmainяк запасного варіанта - pull-request-и не затирають кеш основної гілки; - порядок інструкцій у Dockerfile (рідко змінюване вгорі) важливий так само, як локально: експорт кешу не врятує від інвалідації через
COPY . .на початку; - безпека: кеш у реєстрі може містити вміст проміжних етапів - зберігати його з тими самими правами доступу, що й образи.