Как обойти измененный слой и перейти к кешу более позднего слоя - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть докер-файл со многими слоями. Я строю изображения до слоя n, где сборка не удалась. Затем я изменяю что-то в коде так, что это исправляет проблему сборки слоя n. Я знаю эту кодовую базу и знаю, что это конкретное изменение не влияет на функциональность уровня n-m, но этот уровень перестраивается, потому что он основан на этой кодовой базе. Я хотел бы избежать этой перестройки и вместо этого перейти к кешу слоя n-1 и продолжить сборку оттуда. Возможно ли это?

Если я сделаю docker build --cache-from IMAGE_ID_OF_LAYER_n_1, похоже, что --cache-from игнорируется и сборка начинается со слоя n-m.

1 Ответ

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

Это невозможно. Кэш сборки Docker работает путем вычисления хэша из предыдущего изображения и действий на этом шаге, где он включает фактическое содержимое любых файлов ADD ed или COPY ed.

Например, если у вас есть

FROM some/base         # 00000000
RUN step-l             # 11111111
RUN step-m --option-a  # 22222222
RUN step-n             # 33333333

, то что кэшируется для последней строки, это «изображение 22222222, плюс RUN step-n, создает изображение 33333333».Но если вы затем измените

FROM some/base         # 00000000
RUN step-l             # 11111111
RUN step-m --option-b  # 44444444
RUN step-n

, то в кеше нет ничего для "image 44444444, плюс RUN step-n".

Если ваши шаги сильно отличаются, вы можете воспользоватьсямногоэтапной сборки

FROM some/base AS build-m
RUN step-m --option-a

FROM some/base AS build-n
RUN step-n

FROM some/base
COPY --from=build-m /opt/m /opt/m
COPY --from=build-n /opt/n /opt/n

Тогда даже если вы измените RUN step-m, RUN step-n все еще может быть кэширован.Окончательную сборку все равно придется повторять, но это только копирование файлов.(Представьте себе установку, в которой на шаге webpack выполняется предварительная компиляция приложения браузера, и вам просто нужно скопировать, например, его дерево dist.)

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