Управление кэшем сборки с помощью --cache-from и --cache-to
На этом шаге вы научитесь управлять кэшем сборки Docker, используя флаги --cache-from
и --cache-to
. Кэш сборки может значительно ускорить последующие сборки за счёт повторного использования слоёв из предыдущих сборок. --cache-from
позволяет указать образ для использования в качестве источника кэша, а --cache-to
позволяет экспортировать кэш сборки в указанное место (например, в реестр или локальную директорию).
Сначала убедитесь, что находитесь в директории ~/project
.
cd ~/project
Немного изменим наш Dockerfile
, чтобы смоделировать изменение, которое обычно нарушает кэш. Добавим простую инструкцию RUN
.
Откройте Dockerfile
с помощью nano
:
nano Dockerfile
Добавьте следующую строку после инструкции ARG
в стадии builder
:
RUN echo "Adding a new layer"
Обновлённый Dockerfile
должен выглядеть так:
## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding a new layer"
RUN echo $GREETING > /app/greeting.txt
## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]
Сохраните Dockerfile
и выйдите из nano
.
Теперь соберём образ снова без использования специальных опций кэширования. Docker автоматически использует локальный кэш, если он доступен.
docker build -t my-cached-image .
Вы увидите, что некоторые слои собираются с нуля, так как мы добавили новую инструкцию, что сделало недействительным кэш для последующих инструкций.
Теперь смоделируем сценарий, когда вы хотите использовать ранее собранный образ в качестве источника кэша, возможно из реестра или другой сборки. Для демонстрации мы будем использовать только что собранный образ my-cached-image
в качестве источника кэша для новой сборки.
Сначала внесём ещё одно небольшое изменение в Dockerfile
, чтобы смоделировать очередную модификацию.
Откройте Dockerfile
:
nano Dockerfile
Измените сообщение в новой инструкции RUN
:
RUN echo "Adding another new layer"
Обновлённый Dockerfile
должен выглядеть так:
## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding another new layer"
RUN echo $GREETING > /app/greeting.txt
## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]
Сохраните и выйдите из nano
.
Теперь соберём образ снова, но на этот раз используем флаг --cache-from
, чтобы указать my-cached-image
в качестве источника кэша.
docker build --cache-from my-cached-image -t my-cached-image-from .
Вы увидите, что Docker пытается использовать слои из my-cached-image
. Слой, соответствующий первой инструкции RUN
, скорее всего будет пересобран, так как инструкция изменилась, но последующие слои могут быть взяты из кэша, если они совпадают.
Флаг --cache-to
используется для экспорта кэша сборки. Это особенно полезно в CI/CD-пайплайнах для совместного использования кэша между сборками. Для использования --cache-to
обычно требуется драйвер сборки, поддерживающий экспорт кэша, например docker-container
.
Сначала установим Docker Compose, который часто используется с buildx.
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Теперь создадим экземпляр сборщика buildx.
docker buildx create --use
Теперь соберём образ и экспортируем кэш в локальную директорию. Мы будем использовать экспортёр кэша local
.
docker buildx build --cache-to type=local,dest=./build-cache -t my-exported-cache-image . --load
docker buildx build
: Использует инструмент buildx для сборки
--cache-to type=local,dest=./build-cache
: Экспортирует кэш в локальную директорию build-cache
в текущей директории
-t my-exported-cache-image
: Присваивает тег результирующему образу
.
: Указывает контекст сборки (текущая директория)
--load
: Загружает собранный образ в локальный кэш образов Docker
Вы увидите вывод, показывающий процесс сборки и экспорт кэша. В вашей директории ~/project
будет создана директория build-cache
.
Теперь смоделируем чистую среду сборки и попробуем собрать, используя экспортированный кэш. Сначала удалим собранные образы.
docker rmi my-cached-image my-cached-image-from my-exported-cache-image
Теперь соберём образ снова, на этот раз используя экспортированный кэш в качестве источника.
docker buildx build --cache-from type=local,src=./build-cache -t my-imported-cache-image . --load
--cache-from type=local,src=./build-cache
: Импортирует кэш из локальной директории build-cache
Вы увидите, что Docker использует слои из экспортированного кэша, что значительно ускоряет процесс сборки по сравнению со сборкой с нуля.