В чем разница между RUN и CMD в файле docker и когда я должен использовать один или другой?


Я в замешательстве о том, когда я должен использовать CMD vs RUN. Например, для выполнения команд bash / shell (т. е. ls -la) Я всегда буду использовать CMD или есть ситуация, когда я буду использовать RUN? Попытка понять лучшие практики в отношении этих двух аналогичных директив Dockerfile.

6 122

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/shshell. 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 инструкция не выполняется во время сборки. Это команда по умолчанию, которая запускается при запуске контейнера, если пользователь не предоставляет команду для его запуска.

Примечание: не путайте RUN с CMD. Бежать на самом деле выполняет команду и фиксирует результат; CMD ничего не выполняет во время сборки, но задает команду, предназначенную для изображения.

из ссылки на файл docker

https://docs.docker.com/engine/reference/builder/#cmd

RUN - установите Python, ваш контейнер теперь имеет python, записанный в его образ
CMD - python hello.py , Запустите свой любимый скрипт