2016-06-15 2 views
2

Я видел несколько файлов Dockerfile, и у меня такое ощущение, что люди стараются избегать использования команд RUN. Но почему?Каковы причины не использовать многие команды RUN в файле Docker?

Так что-нибудь (но повторяющийся текст в данном примере) в preferr

RUN gem install \ 
    jekyll \ 
    github-pages 

над

RUN gem install jekyll 
RUN gem install github-pages 
+2

См. [Рекомендации по написанию докеров] (https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/) – jwodder

ответ

5

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

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

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

Последняя причина для кеша. Если вам нужно вытащить новую версию приложения из репозитория пакета, вы также хотите обновить свою информацию в этом удаленном репозитории (например, apt-get update), прежде чем выполнять установку, чтобы вытащить последнюю версию. Если вы отделите apt-get update от apt-get install, команда обновления может быть кэширована из старой сборки, и установка попытается вытащить старые или несуществующие файлы.

+0

По моему опыту этот совет хорош для конечного состояния файла Dockerfile , но не для разработки, где вы в конечном итоге повторно запускаете одну команду. Поэтому я регулярно помещаю все свои команды в отдельные команды RUN и объединяю их, когда я нажимаю их на основную ветвь. Я должен, наверное, автоматизировать это. – kojiro

+0

Отдельные команды, вероятно, ускоряют отладку файла Docker, но как только сам Dockerfile отлаживается, потянув за переменные части приложения, необходимо сохранить его для поздних шагов, чтобы максимизировать, сколько кеша можно использовать повторно. – BMitch

Смежные вопросы