В CI сборки Docker-образов часто каждый раз стартуют «с нуля», даже если изменения минимальные. В итоге теряются минуты на установку зависимостей и сборку. Локальный кеш не помогает, потому что раннеры эфемерные. Решение — вынос кеша слоёв в registry и повторное использование между сборками.
Экспорт и импорт кеша сборки через registry:
BuildKit позволяет сохранять кеш прямо в Docker Registry и подтягивать его в следующих билдах. Теперь слои (например, зависимости) будут подтягиваться из registry, даже если билд идёт на новом CI-раннере.
docker buildx build \
–cache-to=type=registry,ref=myrepo/app:buildcache,mode=max \
–cache-from=type=registry,ref=myrepo/app:buildcache \
-t myrepo/app:latest .
Максимальное использование кеша через mode=max:
Параметр mode=max сохраняет не только финальные слои, но и промежуточные стадии, что особенно важно для multi-stage сборок. Это даёт максимальный эффект ускорения, особенно для сложных Dockerfile.
–cache-to=type=registry,ref=myrepo/app:buildcache,mode=max
Изоляция кеша по веткам или окружениям:
Чтобы избежать конфликтов кеша между ветками, можно использовать разные теги. Это предотвращает «грязные» сборки и делает кеш предсказуемым.
ref=myrepo/app:buildcache-main
ref=myrepo/app:buildcache-dev
❗️ Registry cache — один из самых недооценённых способов ускорить CI. Если билд Docker занимает больше минуты — почти всегда можно ускорить его в разы без изменения кода.