Помещение команд RUN в одну строку ускоряет сборку? - PullRequest
0 голосов
/ 27 мая 2019

В моем файле Docker действительно имеет значение, помещаю ли я команды RUN в одну строку или нет? Делает ли их в одну строку время сборки быстрее?

RUN apt-get update
RUN apt-get -y install --no-install-recommends python3
RUN apt-get -y install --no-install-recommends open-vm-tools

против

RUN apt-get update && apt-get -y install --no-install-recommends python3
RUN apt-get -y install --no-install-recommends open-vm-tools

Ответы [ 3 ]

4 голосов
/ 27 мая 2019

Минимизируя количество слоев, вы уменьшаете размер изображения и да, также время сборки.Это также рекомендуется в разделе «Лучшие практики» «Минимизировать количество слоев» .

В более старых версиях Docker было важно, чтобы вы минимизировали количество слоев в изображениях, чтобыубедитесь, что они были исполнителями.Чтобы уменьшить это ограничение, были добавлены следующие функции:

  • Только инструкции RUN, COPY, ADD создают слои.Другие инструкции создают временные промежуточные образы и не увеличивают размер сборки.

...

2 голосов
/ 27 мая 2019

С практической точки зрения затраты на сборку и время выполнения одной команды RUN против нескольких будут незаметны, и я не буду пытаться оптимизировать здесь исключительно во имя производительности.

В конкретном примере, который вы показываете, пара вещей верна:

  • Инструмент Debian APT сам по себе имеет нетривиальное время запуска; и отдельно от одной команды RUN против нескольких, одна apt-get install против двух будет быстрее.

    RUN apt-get install -y --no-install-recommends python3 open-vm-tools
    
  • Debian и Ubuntu обновляют свои репозитории довольно часто, и когда они это делают, ссылки на пакеты, которые были в apt-get update на прошлой неделе, перестают работать. Между тем, кэширование слоя Docker будет пытаться избежать повторного выполнения шага, который уже выполнен. Если вы создали свой образ неделю назад, Докер скажет: «Я уже сделал это RUN apt-get update, поэтому мне не нужно запускать его снова»; но это означает, что он кэширует устаревший индекс пакета. Важно запустить apt-get update и apt-get install в одном шаге RUN.

    RUN apt-get update \
     && apt-get install -y --no-install-recommends python3 open-vm-tools
    

И вообще:

  • Если у вас есть несколько шагов очистки, которые вы хотите выполнить, важно запустить их в одном шаге RUN. Эта последовательность создает слой после шага сборки, поэтому шаг RUN rm на самом деле не делает последний слой меньше.

    # All of this example should be combined into a single RUN step
    RUN tar xzf package-1.2.3.tar.gz
    RUN cd package-1.2.3 && ./configure && make && make install
    # There is a layer here including the build tree
    RUN rm -rf package-1.2.3
    
  • Если вы выполняете итерацию в Dockerfile, во время отладки может быть проще разбить вещи на множество небольших команд RUN и объединить их позже. Это прекрасно, и в конце вы должны получить идентичное дерево.

    # I'm trying to figure out the configure options so I might
    RUN tar xzf package-1.2.3.tar.gz
    RUN cd package-1.2.3 && ./configure --some-option
    RUN cd package-1.2.3 && make
    
1 голос
/ 27 мая 2019

Если вы не чистите apt-кеш в конце своего «одного лайнера», вы на самом деле многого не достигнете. Большой слой все еще добавлен к вашему изображению.

Основная идея состоит в том, чтобы поместить все установки в одну строку и завершить эту строку очисткой, чтобы при сохранении этого слоя докером (до перехода к следующей команде) он сохранял только недавно установленное программное обеспечение без всех загрузок. и кеш, которые больше не используются.

Что касается скорости, вероятно, вы немного выигрываете, если пишете больше на 1 строке, но я не думаю, что это так уж и много. Конечно, если у вас их сотни, вы увидите разницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...