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

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

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

Введение

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

После создания образа вы изучите различные способы очистки кэша сборки. Это включает удаление неиспользуемых (dangling) кэшей сборки, удаление всего неиспользуемого кэша сборки и использование фильтров для выборочного удаления кэша. Наконец, вы научитесь удалять кэш сборки, сохраняя при этом объем свободного места на диске, что даст вам полное понимание методов управления кэшем сборки.


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/pull("Pull Image from Repository") 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/pull -.-> lab-555043{{"Как использовать команду docker builder prune для удаления кэша сборки Docker"}} docker/images -.-> lab-555043{{"Как использовать команду docker builder prune для удаления кэша сборки Docker"}} docker/prune -.-> lab-555043{{"Как использовать команду docker builder prune для удаления кэша сборки Docker"}} docker/build -.-> lab-555043{{"Как использовать команду docker builder prune для удаления кэша сборки Docker"}} end

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

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

Сначала перейдите в каталог ~/project, если вы еще не находитесь в нем.

cd ~/project

Теперь создадим простой Dockerfile. Назовем его Dockerfile.cache.

nano Dockerfile.cache

Добавьте следующее содержимое в файл Dockerfile.cache:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends curl
COPY . /app
WORKDIR /app
CMD ["curl", "https://www.example.com"]

Сохраните файл и выйдите из редактора nano (нажмите Ctrl + X, затем Y, а затем Enter).

Этот Dockerfile выполняет следующие действия:

  • FROM ubuntu:latest: Использует последнюю версию базового образа Ubuntu.
  • RUN apt-get update && apt-get install -y --no-install-recommends curl: Обновляет список пакетов и устанавливает пакет curl. Это распространенная операция, и, вероятно, она будет кэширована при последующих сборках, если базовый образ и эта инструкция не изменятся.
  • COPY . /app: Копирует содержимое текущего каталога в каталог /app в образе.
  • WORKDIR /app: Устанавливает рабочий каталог в /app.
  • CMD ["curl", "https://www.example.com"]: Определяет команду, которая будет выполняться при запуске контейнера из этого образа.

Перед сборкой убедимся, что у нас есть образ ubuntu:latest локально. Если его нет, Docker автоматически загрузит его во время сборки, но явно загрузить его сначала иногда может сделать вывод сборки более понятным.

docker pull ubuntu:latest

Теперь создадим образ, используя файл Dockerfile.cache. Мы пометим образ как myimage:cachetest.

docker build -t myimage:cachetest -f Dockerfile.cache .

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

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

docker images

В списке вы должны увидеть myimage с тегом cachetest. Этот процесс сборки создал кэш сборки для каждого слоя, определенного в Dockerfile.cache. В следующих шагах мы рассмотрим, как управлять этим кэшем сборки.

Удаление неиспользуемых (dangling) кэшей сборки

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

Сначала немного изменим наш Dockerfile.cache, чтобы создать несколько неиспользуемых кэшей. Мы изменим инструкцию RUN.

Перейдите в каталог ~/project, если вы еще не находитесь в нем.

cd ~/project

Откройте файл Dockerfile.cache для редактирования.

nano Dockerfile.cache

Измените инструкцию RUN с:

RUN apt-get update && apt-get install -y --no-install-recommends curl

на:

RUN apt-get update && apt-get install -y --no-install-recommends wget

Сохраните файл и выйдите из редактора nano (нажмите Ctrl + X, затем Y, а затем Enter).

Теперь пересоберем образ с тем же тегом.

docker build -t myimage:cachetest -f Dockerfile.cache .

Обратите внимание на вывод. Docker, вероятно, повторно использует слой FROM из кэша, но инструкция RUN изменилась, поэтому он выполнит этот шаг снова, создав новый слой. Предыдущий слой, созданный старой инструкцией RUN, теперь является неиспользуемым кэшем сборки, так как он больше не является частью образа myimage:cachetest.

Чтобы увидеть кэш сборки, вы можете использовать команду docker builder prune --dry-run, хотя без более продвинутых инструментов или понимания вывода BuildKit не всегда легко отличить именно неиспользуемые кэши. Простым способом увидеть эффект является удаление неиспользуемых кэшей и просмотр освобожденного места.

Для удаления только неиспользуемых кэшей сборки мы используем команду docker builder prune с опцией --filter dangling=true.

docker builder prune --filter dangling=true

Вам будет предложено подтвердить действие. Введите y и нажмите Enter.

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

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

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

Удаление всех неиспользуемых кэшей сборки

На этом этапе мы научимся удалять все неиспользуемые кэши сборки. В то время как удаление неиспользуемых (dangling) кэшей удаляет слои, не связанные с каким-либо образом, удаление всех неиспользуемых кэшей удаляет любой кэш сборки, который в настоящее время не используется запущенным контейнером или не ссылается на локальный образ. Это более радикальный способ освободить место на диске.

Сначала создадим еще один образ с использованием другого Dockerfile, чтобы добавить больше кэша сборки.

Перейдите в каталог ~/project, если вы еще не находитесь в нем.

cd ~/project

Создайте новый Dockerfile с именем Dockerfile.another.

nano Dockerfile.another

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

FROM alpine:latest
RUN apk update && apk add --no-cache git
COPY . /app2
WORKDIR /app2
CMD ["git", "--version"]

Сохраните файл и выйдите из редактора nano (нажмите Ctrl + X, затем Y, а затем Enter).

Этот Dockerfile использует базовый образ alpine и устанавливает git.

Теперь создайте образ, используя этот новый Dockerfile. Мы пометим его как anotherimage:latest.

docker build -t anotherimage:latest -f Dockerfile.another .

Эта сборка создаст новые слои кэша сборки, специфичные для этого Dockerfile.

Для удаления всех неиспользуемых кэшей сборки мы используем команду docker builder prune без каких-либо фильтров.

docker builder prune -a

Флаг -a означает "все" и указывает, что вы хотите удалить все неиспользуемые кэши сборки, а не только неиспользуемые (dangling) кэши.

Вам будет предложено подтвердить действие. Введите y и нажмите Enter.

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

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

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

Удаление кэша сборки с использованием фильтров

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

Мы уже видели фильтр dangling=true на предыдущем этапе. Другой полезный фильтр - until, который позволяет удалить кэш сборки, созданный до определенной временной метки.

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

Перейдите в каталог ~/project, если вы еще не находитесь в нем.

cd ~/project

Пересоберите образ:

docker build -t myimage:cachetest -f Dockerfile.cache .

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

Для удаления кэша сборки, старшего определенного времени, вы можете использовать опцию --filter until=<timestamp>. Временная метка может быть в различных форматах, включая продолжительность, например 5m (5 минут) или 2h (2 часа).

Удалим кэш сборки, который старше 5 минут.

docker builder prune --filter until=5m

Вам будет предложено подтвердить действие. Введите y и нажмите Enter.

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

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

Вы также можете комбинировать фильтры. Например, чтобы удалить неиспользуемый (dangling) кэш, старший определенного времени, вы можете использовать:

docker builder prune --filter dangling=true --filter until=24h

Это удалит только неиспользуемый (dangling) кэш сборки, который старше 24 часов.

Использование фильтров обеспечивает гибкость в управлении кэшем сборки и помогает более стратегически освобождать место на диске.

Удаление кэша сборки с сохранением определенного объема хранилища

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

Команда docker builder prune имеет опцию --keep-storage, которая позволяет вам указать максимальный объем хранилища, который нужно сохранить для кэша сборки. Вы можете указать размер в байтах или использовать единицы измерения, такие как k, m или g.

Сначала убедимся, что у нас есть кэш сборки для удаления. Мы собрали образы на предыдущих этапах, что создало кэш.

Перейдите в каталог ~/project, если вы еще не находитесь в нем.

cd ~/project

Для удаления кэша сборки с сохранением определенного объема хранилища используйте опцию --keep-storage, за которой следует желаемый размер. Например, чтобы сохранить максимум 1 ГБ кэша сборки:

docker builder prune --keep-storage 1g

Вам будет предложено подтвердить действие. Введите y и нажмите Enter.

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

В выводе будет показано количество освобожденного места. Docker удалит самые старые слои кэша сборки до тех пор, пока общий размер кэша сборки не станет ниже указанного лимита --keep-storage.

Вы можете настроить значение --keep-storage в зависимости от доступного места на диске и того, сколько кэша вы хотите сохранить для более быстрых сборок. Например, чтобы сохранить максимум 500 МБ:

docker builder prune --keep-storage 500m

Снова подтвердите действие, введя y и нажав Enter.

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

Резюме

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

Затем мы рассмотрели различные способы удаления кэша сборки. Мы узнали, как удалить неиспользуемый (dangling) кэш сборки, то есть записи кэша, которые больше не связаны ни с какой сборкой. Мы также обсудили, как удалить весь неиспользуемый кэш сборки, эффективно очистив все записи кэша, которые в настоящее время не используются ни одним образом. Кроме того, мы показали, как использовать фильтры с командой prune для выборочного удаления кэша сборки на основе определенных критериев. Наконец, мы рассмотрели возможность удаления кэша сборки с сохранением хранилища, связанного с определенными записями кэша, что может быть полезно в определенных сценариях.