Как я могу запретить кэширование инструкции Dockerfile?
В моем Dockerfile
я использую curl
или ADD
для загрузки последней версии архива, например:
FROM debian:jessie
...
RUN apt-get install -y curl
...
RUN curl -sL http://example.com/latest/archive.tar.gz --output archive.tar.gz
...
ADD http://example.com/latest/archive2.tar.gz
...
Оператор RUN
, который использует curl
или ADD
, создает свой собственный слой изображения. Это будет использоваться как кеш для будущих исполнений docker build
.
Вопрос. Как отключить кеширование для этих инструкций?
Было бы здорово найти что-то вроде недействительности кэша. Например. используя HTTP ETags или путем запроса последнего измененного поля заголовка. Это даст возможность быстро выполнить проверку на основе заголовков HTTP, чтобы решить, можно ли использовать кешированный уровень или нет.
Я знаю, что некоторые грязные трюки могут помочь, например. вместо этого загрузите оболочку script в инструкции RUN
. Его имя будет изменено до запуска docker build
нашей системой сборки. И я мог бы выполнить проверки HTTP внутри этого script. Но тогда мне нужно сохранить либо последний использованный ETag, либо последний модифицированный файл. Мне интересно, есть ли еще более чистые и родные функции Docker, которые я мог бы использовать здесь.
Ответы
Ответ 1
Можно задать аргумент build-time, чтобы принудительно разбить кеш с этого шага вперед. Например, в вашем файле Docker поставьте
ARG CACHE_DATE=not_a_date
а затем дает этому аргументу новое значение для каждой новой сборки. Лучшим, конечно же, является метка времени.
docker build --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) ...
Убедитесь, что значение представляет собой строку без пробелов, в противном случае клиент-докер будет ошибочно воспринимать это как несколько аргументов.
См. подробное обсуждение Проблема 22832.
Ответ 2
docker build --no-cache приведет к недействительности кеша для всех команд.
команда Dockerfile ADD, используемая для того, чтобы кэш недействителен. Хотя было улучшено в последней версии докера:
Докер должен проверять любые файлы, добавленные через ADD, а затем решать, следует ли использовать кеш или нет.
Итак, если добавленный файл был изменен, кеш должен быть недействительным для команды ADD
.
Проблема 1326 упоминает другие советы:
Это сработало.
RUN yum -y install firefox #redo
Итак, похоже, что Docker снова запустит этот шаг (и все шаги ниже), если строка, которую я передаю в команду RUN
, изменяется в любом случае - , даже это просто комментарий.
Кэш докеров используется только, и только если ни один из его предков не изменился (это имеет смысл, так как следующая команда добавит изменения к предыдущему слою).
Кэш используется, если нет какого-либо символа, который был изменен (так что даже достаточно пространства, чтобы сделать недействительным кеш).
Ответ 3
добавить ; exit 0
после того, как команда отменит кеширование оттуда.
Пример:
RUN apt-get install -y unzip; exit 0