На каком основании docker во время сборки решает, создавать ли новый слой или использовать существующий? - PullRequest
0 голосов
/ 06 мая 2020

В файле docker есть различные команды, такие как FROM, RUN, et c. Каждая из этих команд создает слой (промежуточное изображение).

Во время сборки, если слой уже существует, на каком основании docker решает, создавать ли новый слой или использовать существующий?

1 Ответ

1 голос
/ 06 мая 2020

Система кеширования 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-адреса больше не действительны.
...