Алгоритм кэширования Docker довольно прост.Он просматривает предыдущее состояние сборки образа и строку команды, которую вы запускаете.Если вы выполняете COPY
или ADD
, он также просматривает хэш копируемых файлов.Если предыдущая сборка найдена на сервере с тем же предыдущим состоянием и выполняемой командой, она будет повторно использовать кеш.
Это означает, что внешнее изменение, например извлечение пакетов из внешнего хранилища, не будет обнаружено икэш будет использоваться повторно, а не перезапускать эту строку.Есть два решения, которые я видел в этом:
Вариант 1. Измените вашу команду, добавив версии в зависимости.Когда одна из этих зависимостей изменится, вам нужно будет обновить свою сборку.Это добавленная работа, но также гарантирует, что вы извлекаете только те версии, к которым готовы.Это будет выглядеть так (исправление boost-libs на номер версии 1.5):
# Install External dependencys
RUN apt update && apt install -y\
boost-libs=1.5 \
etc...
Вариант 2: изменить аргумент сборки.Они внедряются как переменные среды в команды RUN
, и docker видит изменение в среде как другую команду для запуска.Это выглядело бы так:
# Install External dependencys
ARG UNIQUE_VAR
RUN apt update && apt install -y\
boost-libs \
etc...
А затем вы могли бы построить вышеперечисленное с помощью следующего, чтобы запускать кэш-память для ежедневного воссоздания в этой строке:
docker build --build-arg "UNIQUE_VAR=$(date +%Y%m%d)" ...
Обратите внимание, есть такжевозможность строить без кеша в любое время с помощью:
docker build --no-cache ...
Это приведет к игнорированию кеша для всех шагов (кроме строки from).