Траблшутинг сбоев сборки Docker Build: кэширование зависимостей и BuildKit
- Ошибка
failed to solve with frontend dockerfile.v0при выполненииdocker build. - Сборки в CI/CD каждый раз заново выкачивают гигабайты библиотек (Cache Miss).
- Сбои BuildKit из-за переполнения пространства метаданных и временных файлов.
1. Включение BuildKit по умолчанию
Добавьте в /etc/docker/daemon.json:
{
"features": {
"buildkit": true
}
}2. Использование Cache Mounts для менеджеров пакетов (Go, Pip, Npm)
# syntax=docker/dockerfile:1
FROM golang:1.22-alpine
WORKDIR /src
# Монтирование персистентного кэша модулей и сборки компилятора
RUN --mount=type=cache,target=/go/pkg/mod/ \
--mount=type=cache,target=/root/.cache/go-build \
go build -o /bin/app .3. Монтирование кэша APT-пакетов в Debian/Ubuntu
# syntax=docker/dockerfile:1
FROM ubuntu:22.04
RUN rm -f /etc/apt/apt.conf.d/docker-clean
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && apt-get install -y --no-install-recommends git gcc4. Очистка поврежденного кэша BuildKit
# Просмотр занятого пространства сборщика
docker buildx du
# Полная принудительная очистка кэша
docker buildx prune --all --force Частые вопросы (FAQ)
Что означает директива # syntax=docker/dockerfile:1 в начале Dockerfile?
Она сообщает BuildKit загрузить последнюю стабильную версию синтаксического парсера Dockerfile из Docker Hub, разблокируя поддержку --mount=type=cache и секретов.
Как экспортировать кэш сборки в удаленный Docker Registry в CI/CD?
Используйте флаги: docker buildx build --cache-to=type=registry,ref=registry.example.com/app:cache,mode=max --cache-from=type=registry,ref=registry.example.com/app:cache .