Перебор кеша в Dockerfile без предоставления внешних аргументов сборки - PullRequest
1 голос
/ 10 апреля 2019

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

В настоящее время мы используем

ENV CACHE_BUST=$($RANDOM)

При дальнейшей проверке, смешноДостаточно того, что кэшируется:

Step 1/1 : ENV CACHE_BUST=$($RANDOM) ---> Using cache

Есть ли какой-либо способ изнутри Dockerfile разрушить кеш, не передавая уникальный build-arg (например, дату) на этапе сборки?

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

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

Варианты обойти это включают в себя:

  1. Передача изменяемого аргумента сборки (например, установка его на отметку даты).
  2. Изменение файла, включенного в изображение, с помощью COPY или ADD.
  3. Запуск вашей сборки с опцией --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 , который позволяет вводить явный разрыв кэша или уникальную переменную, которая приводит к разрыву кэша.

1 голос
/ 11 апреля 2019

Вы можете добавить слой ADD с загрузкой некоторой динамической страницы из стабильного источника в начале Dockerfile.Изображение всегда будет пересоздано без использования кеша.

Просто пример Dockerfile:

FROM alpine:3.9
ADD https://google.com cache_bust
RUN apk add --no-cache wget

ps. Я полагаю, вы знаете о опции docker build --no-cache.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...