На практическом уровне, особенно на уровне отдельных слоев, это не имеет значения. Раньше был задокументированный предел в 127 слоев на изображении; в большинстве практических образов их число не превышает 20. В принципе, прохождение слоев файловой системы Docker может быть медленнее, если их больше, но применяется кэширование файловой системы ядра Linux, и для большинства чувствительных к производительности вещей избегать обращения к диску на обычно все лучше.
Как всегда с соображениями производительности, если это действительно важно для вас, измерьте это в контексте вашего конкретного приложения c.
Я бы сказал, что на самом деле о Docker слоях изображений следует помнить три вещи:
Добавление слоя никогда не уменьшает размер изображения. Если вы устанавливаете что-либо в более раннюю RUN
шаг и удалите его на более позднем шаге RUN
, ваше изображение завершится со всем установленным контентом из более раннего слоя, а также с дополнительным слоем-заполнителем, который говорит: «Этот материал удален сейчас». Это особенно происходит вокруг инструментов сборки. @ eez0 расскажет об этом случае немного подробнее в их ответе .
Слои - это единица Docker кэширования изображений. Если вы повторите шаг docker build
и вы запускаете идентичную команду на том же слое, который уже существовал, Docker пропустит его выполнение и повторно использует полученный слой из предыдущей сборки. Это несколько влияет на стиль Dockerfile (вы всегда хотите RUN apt-get update && apt-get install
в одной и той же команде, если вы изменяете список устанавливаемых пакетов), но не влияет на производительность.
Вы можете docker run
результат отдельного шага. Это полезный метод отладки: вывод docker build
включает идентификатор изображения для каждого шага, и вы можете docker run
ваш промежуточные результаты. Если какой-то шаг не удался, вы можете получить отладочную оболочку на изображении до начала этого шага и посмотреть, что на самом деле находится в файловой системе.
В вашем примере два вопроса стоит задать сколько накладных расходов имеет отдельный шаг загрузчика и насколько вероятно изменение этого набора плагинов. Если вы можете часто что-то менять, отдельные команды RUN
позволят вам лучше кэшировать слои в последующих сборках; если сам инструмент загрузки имеет большие накладные расходы (может быть, он собирает все загруженные плагины в один zip-файл), то запуск его только один раз может быть быстрее.
Обычная практика - попытаться собрать вещи в один RUN
, но это своего рода микрооптимизация, которая обычно не имеет большого значения на практике. В случае установки пакетов я привык видеть только одну строку apt-get install
или pip install
в Dockerfile, и по стилю я мог бы ожидать этого и здесь. Если вы находитесь в процессе разработки, одну команду на RUN
строку легче понять и отладить.