Как использовать команду docker buildx prune для управления кэшем сборки

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе мы рассмотрим, как эффективно управлять кэшем сборки Docker с помощью команды docker buildx prune. Кэш сборки — это важный механизм ускорения сборки образов Docker за счёт повторного использования ранее собранных слоёв. Однако со временем этот кэш может накапливаться и занимать значительное место на диске.

Мы начнём с создания простого образа Docker для генерации кэша сборки. Затем продемонстрируем различные способы очистки этого кэша с помощью docker buildx prune. Это включает: очистку всего кэша без фильтров, выборочную очистку с сохранением недавних данных с помощью опции --filter, ограничение размера кэша с помощью --keep-storage и, наконец, очистку всего кэша сборки, включая внутренние образы, с использованием флага --all. К концу этой лабораторной работы вы получите чёткое понимание того, как эффективно управлять кэшем сборки Docker.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ImageOperationsGroup -.-> docker/images("List Images") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/images -.-> lab-555061{{"Как использовать команду docker buildx prune для управления кэшем сборки"}} docker/prune -.-> lab-555061{{"Как использовать команду docker buildx prune для управления кэшем сборки"}} docker/build -.-> lab-555061{{"Как использовать команду docker buildx prune для управления кэшем сборки"}} end

Создание образа для генерации кэша сборки

На этом шаге мы соберём простой Docker-образ, чтобы создать кэш сборки. Кэш сборки Docker — это механизм, ускоряющий процесс сборки за счёт повторного использования слоёв из предыдущих сборок. При сборке Docker-образа каждая инструкция в Dockerfile создаёт слой. Если инструкция не изменилась с последней сборки, Docker может повторно использовать существующий слой вместо его пересборки.

Сначала создадим директорию для нашего проекта и перейдём в неё.

mkdir ~/project/docker-cache-demo
cd ~/project/docker-cache-demo

Теперь создадим простой Dockerfile. Этот Dockerfile скопирует файл в образ, а затем выполнит команду.

nano Dockerfile

Добавим следующее содержимое в Dockerfile:

FROM ubuntu:latest
COPY . /app
RUN echo "Hello, Docker Cache!" > /app/message.txt
CMD ["cat", "/app/message.txt"]

Сохраним и закроем файл.

Далее создадим простой файл, который будет скопирован в образ.

nano message.txt

Добавим содержимое в message.txt:

This is a test message.

Сохраним и закроем файл.

Теперь соберём Docker-образ. Мы присвоим образу тег cache-demo.

docker build -t cache-demo .

Вы увидите вывод, показывающий, что Docker собирает образ шаг за шагом. Каждый шаг соответствует инструкции в Dockerfile. Docker загрузит образ ubuntu:latest, если он ещё не присутствует, скопирует файл message.txt, а затем выполнит команду echo.

После завершения сборки можно проверить создание образа, выведя список доступных образов.

docker images

В списке образов должен появиться cache-demo.

Теперь соберём образ снова, не внося изменений в Dockerfile или message.txt.

docker build -t cache-demo .

На этот раз процесс сборки будет значительно быстрее. Docker повторно использует существующие слои из предыдущей сборки, так как инструкции в Dockerfile и содержимое message.txt не изменились. В выводе для большинства шагов будет указано "Using cache". Это демонстрирует, как кэш сборки Docker ускоряет последующие сборки.

Очистка кэша сборки без фильтров

На этом шаге мы научимся очищать кэш сборки Docker без использования фильтров. Очистка кэша сборки помогает освободить место на диске путём удаления неиспользуемых записей кэша.

Команда для очистки кэша сборки — docker builder prune. По умолчанию эта команда удаляет все записи кэша сборки, которые не используются существующими образами.

Выполним команду для очистки кэша сборки:

docker builder prune

Система запросит подтверждение действия. Введите y и нажмите Enter для продолжения.

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

В выводе будет показан список удалённых записей кэша сборки и общий объём освобождённого места.

Чтобы увидеть эффект очистки, попробуем собрать образ снова:

cd ~/project/docker-cache-demo
docker build -t cache-demo .

На этот раз процесс сборки может занять больше времени, чем при второй сборке на предыдущем шаге, так как часть или весь кэш мог быть удалён. Docker пересоберёт очищенные слои.

Очистка без фильтров полезна, когда нужно удалить весь неиспользуемый кэш для максимального освобождения места. Однако это может повлиять на скорость последующих сборок, если вы часто пересобираете образы. В следующих шагах мы рассмотрим, как использовать фильтры для более точного контроля над тем, какие записи кэша будут удалены.

Очистка кэша сборки с сохранением свежих данных с помощью --filter

На этом шаге мы научимся очищать кэш сборки Docker, сохраняя свежие данные с использованием флага --filter. Это полезно, когда нужно освободить место на диске, но при этом сохранить преимущества кэша для недавних сборок.

Команда docker builder prune поддерживает различные фильтры. Один из полезных фильтров — until, который позволяет удалять записи кэша сборки старше определённой временной метки. Метка времени может быть указана как конкретная дата и время, либо как интервал относительно текущего момента.

Сначала пересоберём наш образ, чтобы убедиться, что у нас есть свежий кэш сборки:

cd ~/project/docker-cache-demo
docker build -t cache-demo .

Теперь очистим кэш сборки, сохранив записи за последние 5 минут. Мы можем использовать фильтр until с интервалом вида 5m:

docker builder prune --filter "until=5m"

Система запросит подтверждение действия. Введите y и нажмите Enter для продолжения.

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

В выводе будут показаны удалённые записи кэша сборки. Будут удалены только записи старше 5 минут.

Также можно указать конкретную временную метку. Например, для удаления записей кэша старше определённой даты и времени используйте формат "ГГГГ-ММ-ДДTЧЧ:ММ:СС".

Использование фильтра until с временным интервалом — это удобный способ сохранить самые свежие данные кэша сборки, одновременно очищая старые записи, что позволяет балансировать между использованием дискового пространства и скоростью сборки.

Очистка кэша сборки с сохранением определённого объёма с помощью --keep-storage

На этом шаге мы научимся очищать кэш сборки Docker, сохраняя заданный объём хранилища с использованием флага --keep-storage. Это полезно, когда необходимо ограничить дисковое пространство, используемое кэшем сборки.

Команда docker builder prune с флагом --keep-storage позволяет указать максимальный объём хранилища для сохранения кэша сборки. Docker будет удалять самые старые записи кэша, пока общий размер оставшегося кэша не станет меньше указанного лимита.

Сначала соберём наш образ несколько раз, чтобы создать больше записей в кэше сборки:

cd ~/project/docker-cache-demo
docker build -t cache-demo:v1 .
docker build -t cache-demo:v2 .

Теперь очистим кэш сборки, оставив только 1 ГБ хранилища. Размер можно указывать в байтах, килобайтах (k), мегабайтах (m) или гигабайтах (g):

docker builder prune --keep-storage 1g

Система запросит подтверждение действия. Введите y и нажмите Enter для продолжения:

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

В выводе будут показаны удалённые записи кэша сборки и общий объём освобождённого пространства. Docker удалит самые старые записи кэша, пока общий размер оставшегося кэша не составит примерно 1 ГБ или меньше.

Использование флага --keep-storage — это эффективный способ управления дисковым пространством, занимаемым кэшем сборки, особенно в средах с ограниченными ресурсами хранилища.

Полная очистка кэша сборки, включая внутренние образы, с помощью --all

На этом шаге мы научимся полностью очищать кэш сборки Docker, включая внутренние образы, используя флаг --all. Это наиболее агрессивный способ очистки кэша сборки, который удаляет все записи кэша независимо от того, используются ли они существующими образами.

Команда docker builder prune с флагом --all (или сокращённо -a) удалит все записи кэша сборки. Это включает записи кэша, связанные с промежуточными образами сборки, которые не имеют тегов.

Выполним команду для полной очистки кэша сборки:

docker builder prune --all

Система запросит подтверждение действия. Введите y и нажмите Enter для продолжения:

WARNING! This will remove all build cache.
Are you sure you want to continue? [y/N] y

В выводе будут показаны все удалённые записи кэша сборки и общий объём освобождённого пространства. Эта команда обычно освобождает больше всего дискового пространства по сравнению с очисткой без флага --all или с использованием фильтров.

После выполнения этой команды, если вы снова соберёте образ cache-demo, процесс, скорее всего, займёт больше времени, так как весь кэш сборки будет удалён, и Docker придётся пересобирать все слои:

cd ~/project/docker-cache-demo
docker build -t cache-demo .

Использование docker builder prune --all полезно, когда необходимо освободить максимально возможное дисковое пространство или когда требуется гарантировать чистую сборку без использования существующего кэша. Однако учтите, что это значительно замедлит последующие сборки до тех пор, пока не будет сгенерирован новый кэш.

Итоги

В этой лабораторной работе мы изучили управление кэшем сборки Docker с помощью команды docker buildx prune. Мы начали с создания простого Docker-образа для генерации кэша сборки, наблюдая, как Docker повторно использует слои для ускорения последующих сборок.

Затем мы рассмотрели различные способы очистки кэша сборки. Мы узнали:

  • Как очистить весь кэш без фильтров
  • Как сохранить недавние данные кэша с помощью опции --filter
  • Как ограничить размер кэша с помощью параметра --keep-storage
  • Как полностью удалить кэш сборки, включая внутренние образы, с флагом --all

Эти техники крайне важны для управления дисковым пространством и оптимизации среды сборки.