Кэш слоя Docker по сути говорит: «Если я начну с изображения 01234567 и RUN some command
, то получу изображение 2468ace0». Если что-то изменилось, и вместо этого у вас есть изображение 13579bdf, нет способа замкнуть его, кроме повторного запуска команды.
Существует несколько подходов, которые могут помочь смягчить это:
- Запускайте тяжелые команды, которые на самом деле не зависят от кода приложения в начале вашего Dockerfile.
RUN apt-get install
перед вами COPY .
.
- Минимизируйте количество материала на одном изображении. Не пытайтесь поместить два отдельных приложения с длинными сборками в один и тот же образ.
- Используйте многоэтапные сборки, где каждый этап может независимо использовать преимущества кэша, и у вас будет относительно дешевый
COPY
в конечном изображении.
- Предварительно скомпилируйте некоторую часть последовательности на хосте и
COPY
результат в образ, а не RUN lengthy-install
. (Этот метод был чрезвычайно полезен до появления многоэтапных сборок и по-прежнему актуален.)