Чтобы разрушить кэш, один из входов должен быть изменен. Если выполняемая команда та же самая, кэш будет использоваться повторно, даже если у команды есть внешние зависимости, которые изменились, поскольку docker не может видеть эти внешние зависимости.
Варианты обойти это включают в себя:
- Передача изменяемого аргумента сборки (например, установка его на отметку даты).
- Изменение файла, включенного в изображение, с помощью COPY или ADD.
- Запуск вашей сборки с опцией
--no-cache
.
Поскольку вы не хотите использовать опцию 1, существует способ сделать опцию 3 в определенной строке, но только если вы можете разбить ваш Dockerfile на 2 части. В первом Dockerfile есть все строки, которые есть у вас сегодня, вплоть до момента, когда вы хотите сломать кеш. Затем второй Dockerfile имеет строку FROM, которая зависит от первого Dockerfile, и вы строите это с опцией --no-cache
. Э.Г.
Dockerfile1:
FROM base
RUN normal steps
Dockerfile2
FROM intermediate
RUN curl external.jar>file.jar
RUN other lines that cannot be cached
CMD your cmd
Затем построить с:
docker build -f Dockerfile1 -t intermediate .
docker build -f Dockerfile2 -t final --no-cache .
Единственный другой вариант, о котором я могу подумать, - это создать новый интерфейс с BuildKit , который позволяет вводить явный разрыв кэша или уникальную переменную, которая приводит к разрыву кэша.