В чем разница между RUN и CMD в файле docker и когда я должен использовать один или другой?
Я в замешательстве о том, когда я должен использовать CMD vs RUN. Например, для выполнения команд bash / shell (т. е. ls -la
) Я всегда буду использовать CMD или есть ситуация, когда я буду использовать RUN? Попытка понять лучшие практики в отношении этих двух аналогичных директив Dockerfile.
6 ответов:
выполнить - это шаг построения изображения, состояние контейнера после
RUN
команда будет зафиксирована в образе docker. Dockerfile может иметь многоRUN
шаги, что слой поверх друг друга, чтобы построить изображение.CMD - это команда, которую контейнер выполняет по умолчанию при запуске построенного образа. Dockerfile может иметь только один
CMD
. ЭлементCMD
может быть переопределен при создании контейнера сdocker run $image $other_command
.точка входа также тесно связан с
CMD
и может изменить способ контейнер начинает изображение.
нашел этой статья очень полезная, чтобы понять разницу между ними:
выполнить - Инструкция RUN позволяет установить приложение и пакеты требуется для этого. Он выполняет любые команды поверх текущего изображения и создает новый слой, фиксируя результаты. Часто вы найдете несколько инструкций запуска в Dockerfile.
CMD - Инструкция CMD позволяет установить значение по умолчанию команда, которая будет выполняется только при запуске контейнера без указания команды. Если контейнер Docker работает с командой, команда по умолчанию будет игнорируемый. Если Dockerfile имеет более одной инструкции CMD, все, кроме последнего
Инструкции по УМК игнорируются.
запуск команды триггеры, пока мы строим образ докера.
CMD-команда срабатывает при запуске созданного образа docker.
RUN:
The
RUN
инструкция выполнит любую команду в новом слое поверх текущего изображение, и зафиксируйте это изображение. Изображение, зафиксированное таким образом, будет использоваться для следующего инструкция в файла Docker.The
RUN
инструкция имеет две формы:
- The
RUN <command>
форма- The
RUN ["executable", "arg1", "arg2"...]
формав первой форме, команда выполняется в консоли, в частности,
/bin/sh -c <command>
оболочки. Вторая форма полезна в тех случаях, когда базовый образ не имеет/bin/sh
shell. Docker использует кэш для этих сборок изображений. Таким образом, в случае сбоя сборки образа где-то посередине, следующий запуск будет повторно использовать ранее успешные частичные сборки и продолжить с точки, где он не удался.Примечание
кэш будет недействительным в этих ситуации:
- когда команда docker build выполняется с помощью
--no-cache
флаг.- когда не кэшируемая команда, такая как
apt-get
обновление дали. Все следующие инструкции по запуску будут выполнены снова.- когда впервые столкнулся с
ADD
инструкция аннулирует кэш для все следующие инструкции из файла Dockerfile если содержимое контекст изменился. Это также приведет к недействительности кэша дляRUN
инструкции.CMD:
The
CMD
инструкция предоставляет команду по умолчанию для выполнения контейнера. Он имеет следующие формы:
- The
CMD ["executable", "arg1", "arg2"...]
форма- The
CMD ["arg1", "arg2"...]
форма- The
CMD command arg1 arg2
... форма- первая форма похожа на
exec
и это предпочтительная форма, где первое значение-это путь к исполняемому файлу и является далее следуют аргументы.- вторая форма опускает исполняемый файл, но требует
ENTRYPOINT
инструкция для указания исполняемого файла.- если вы используете форму оболочки
CMD
инструкции, то<command>
команда будет выполняться в/bin/sh -c
shell.Примечание:
если пользователь предоставляет команду в docker run, она переопределяет
CMD
команда.резюме
разницу между
RUN
иCMD
инструкции заключается в том, чтоRUN
инструкция фактически запускает команду и фиксирует ее, тогда какCMD
инструкция не выполняется во время сборки. Это команда по умолчанию, которая запускается при запуске контейнера, если пользователь не предоставляет команду для его запуска.