Docker Cache: Как сделать чистую пересборку образа, Запрет кеширования (3 способа)

В Docker есть несколько способов запретить использование кеша при сборке образов, что позволяет гарантировать, что все шаги выполняются с нуля или с актуальными данными. Вот три основных метода:

  1. Использование опции –no-cache при выполнении команды docker build, что полностью отключает кеширование для всех шагов сборки (каждый слой образа будет пересобран заново).
  2. Применение инструкции ARG.
  3. Использование инструкции ADD для копирования файлов, которые изменяются между сборками.

Опция –no-cache в команде docker build используется для полной пересборки образа без использования кеша. Это означает, что каждый шаг сборки будет выполняться заново, без учета предыдущих сборок. Пример использования опции –no-cache:

docker build --no-cache -t myapp .

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

Для принудительной пересборки Docker-образа с определенного шага и использования кастомных аргументов в docker build, можно использовать аргументы сборки (–build-arg) в сочетании с инструкцией ARG в Dockerfile. Это позволяет вам изменять аргументы сборки, чтобы контролировать кеширование слоев.

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

1. Измените ваш Dockerfile, добавив ARG инструкцию:

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
ARG CACHEBUST=1
COPY . .
CMD ["node", "server.js"]

Здесь CACHEBUST - это аргумент, который вы можете изменить для инвалидации кеша на шаге копирования исходного кода.

2. Соберите образ с использованием кастомного аргумента. Когда вы хотите принудительно пересобрать образ с шага копирования исходного кода, вы можете изменить значение CACHEBUST.

docker build --build-arg CACHEBUST=$(date +%s) -t myapp .

В этом примере используется текущая дата и время в секундах ($(date +%s)) как значение для CACHEBUST. Каждый раз, когда вы выполняете сборку с новым значением CACHEBUST, Docker будет пересобирать слои, начиная с шага, где используется этот аргумент.

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

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

FROM ubuntu:latest
Копируем файл с меткой времени
ADD timestamp /
 
Следующие шаги будут выполнены без использования кеша,
если файл timestamp изменился
RUN apt-get update && apt-get install -y curl

В этом примере:

  1. Выбран базовый образ ubuntu:latest.
  2. Инструкция ADD добавляет файл timestamp в корень файловой системы образа. Каждый раз, когда содержимое файла timestamp изменяется, Docker рассматривает этот шаг как измененный, и все следующие шаги выполняются заново, без использования кеша.
  3. Команда RUN apt-get update && apt-get install -y curl и все последующие команды будут выполнены без кеширования, если файл timestamp был изменен с момента последней сборки образа.

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

Отключение кеширования в Dockerfile с помощью команды ADD может быть выполнено путем добавления файлов из внешних источников, например GitHub. У GitHub существует для каждого репозитория страница, которая возвращает JSON для самых последних коммитов. Пример ниже демонстрирует такой подход. Неважно, куда выводится файл, поэтому отправляем его в /dev/null.

FROM ubuntu:latest
# Добавляем файл из удаленного репозитория GitHub
ADD https://github.com/darkfire13/RouterOS-CHR-Install/commits /dev/null
 
# Следующие шаги будут пересобраны, если содержимое по указанной ссылке изменилось
RUN apt-get update && apt-get install -y somepackage

Использование кастомных аргументов сборки и опции –no-cache в Docker позволяет контролировать процесс сборки образов и управлять кешированием. Кастомные аргументы сборки полезны для целенаправленного контроля кеширования на определенных шагах, в то время как опция –no-cache полезна для полной пересборки образа.

PQ VPS сервера в 28+ странах.