Принудительно кэшировать шаг в Dockerfile - PullRequest
0 голосов
/ 18 мая 2019

Скажем, у меня есть такая строка в Dockerfile:

RUN git fetch origin my_branch
RUN pip install -r requirements.txt

Есть ли способ заставить Docker использовать кеш для этих строк? Что-то вроде:

FORCE-CACHE-ON
RUN git fetch origin my_branch
RUN pip install -r requirements.txt
CACHE-OFF

1 Ответ

0 голосов
/ 18 мая 2019

Кэш слоя Docker по сути говорит: «Если я начну с изображения 01234567 и RUN some command, то получу изображение 2468ace0». Если что-то изменилось, и вместо этого у вас есть изображение 13579bdf, нет способа замкнуть его, кроме повторного запуска команды.

Существует несколько подходов, которые могут помочь смягчить это:

  • Запускайте тяжелые команды, которые на самом деле не зависят от кода приложения в начале вашего Dockerfile. RUN apt-get install перед вами COPY ..
  • Минимизируйте количество материала на одном изображении. Не пытайтесь поместить два отдельных приложения с длинными сборками в один и тот же образ.
  • Используйте многоэтапные сборки, где каждый этап может независимо использовать преимущества кэша, и у вас будет относительно дешевый COPY в конечном изображении.
  • Предварительно скомпилируйте некоторую часть последовательности на хосте и COPY результат в образ, а не RUN lengthy-install. (Этот метод был чрезвычайно полезен до появления многоэтапных сборок и по-прежнему актуален.)
...