Система кеширования docker build
довольно проста. Для большинства команд, если предыдущий уровень был кэширован, и есть уровень, который выполняет ту же самую команду (RUN
, ENV
, CMD
, ...), то он повторно использует кэшированный слой и повторяет эту проверку. для следующей команды. Для команд COPY
и ADD
решение основывается на ha sh содержимого файла.
Это подробно описано в Рекомендации по написанию файлов Docker в Docker документация.
На практике это означает несколько вещей:
- Вам почти никогда не понадобится
docker build --no-cache
, поскольку, если файл Dockerfile или любые связанные файлы изменились, кеш будет автоматически аннулируется. - Если у вас есть дорогостоящий шаг по установке зависимостей (
npm install
, pip install
, bundle install
, ...), имейте первый шаг, который только COPY
s файлов, которые перечисляют зависимости, затем RUN whatever install
, затем COPY
остальная часть вашего приложения. Это позволяет избежать аннулирования кеша для этапа «установки», если был изменен только код приложения. - Если у вас есть образ на основе Debian или Ubuntu,
RUN apt-get update && apt-get install
в одной команде. Это позволяет избежать проблемы, когда URL-адреса из шага «update» кэшируются, но пакеты на шаге «install» изменяются, а кешированные URL-адреса больше не действительны.