Я не понимаю, когда я должен использовать CMD
против RUN
. Например, для выполнения команд bash / shell (то есть ls -la
) я всегда использовал бы CMD
или есть ситуация, где я бы использовал RUN
? Попытка понять лучшие практики об этих двух похожих Dockerfile
директивах.
docker
dockerfile
TakeSoUp
источник
источник
Ответы:
RUN - это шаг построения образа, состояние контейнера после того, как
RUN
команда будет зафиксирована в образе контейнера. Dockerfile может иметь многоRUN
шагов, которые накладываются друг на друга, чтобы построить образ.CMD - это команда, которую контейнер выполняет по умолчанию при запуске встроенного образа. Dockerfile будет использовать только окончательный вариант
CMD
.CMD
Может быть переопределен при запуске контейнера сdocker run $image $other_command
.ENTRYPOINT также тесно связан
CMD
и может изменять способ, которым контейнер запускает изображение.источник
RUN
необходимое для настройки вашей среды, и ваш (только) CMD запускает процесс, запущенный в вашем контейнере, например, для nginx,CMD ["nginx", "-g", "daemon off;"]
RUN
- команда срабатывает при создании образа докера.CMD
- команда срабатывает при запуске созданного образа докера.источник
Я нашел это статью очень полезной, чтобы понять разницу между ними:
БЕГАТЬ - инструкция RUN позволяет установить приложение и необходимые для него пакеты. Он выполняет любые команды поверх текущего изображения и создает новый слой, фиксируя результаты. Часто вы найдете несколько инструкций RUN в Dockerfile.
CMD - инструкция CMD позволяет установить команду по умолчанию, которая будет выполняться только при запуске контейнера без указания команды. Если контейнер Docker запускается с командой, команда по умолчанию будет проигнорирована. Если Dockerfile содержит более одной инструкции CMD, все команды CMD, кроме последних
, игнорируются.
источник
RUN - установите Python, ваш контейнер теперь сгорел в своем образе python
CMD - python hello.py, запустите ваш любимый скрипт
источник
Команда RUN: команда RUN в основном выполняет команду по умолчанию, когда мы строим образ. Также будет зафиксировано изменение изображения для следующего шага.
Может быть более 1 команды RUN, чтобы помочь в процессе создания нового образа.
Команда CMD: Команды CMD просто устанавливают команду по умолчанию для нового контейнера. Это не будет выполнено во время сборки.
Если в файле Docker более 1 команды CMD, то все они игнорируются, кроме последней. Поскольку эта команда не будет выполнять ничего, а просто установить команду по умолчанию.
источник
из ссылки на файл докера
https://docs.docker.com/engine/reference/builder/#cmd
источник
RUN : может быть много, и это используется в процессе сборки , например, установка нескольких библиотек
CMD : Может только 1, что ваш выполнить начальную точку (например
["npm", "start"]
,["node", "app.js"]
)источник
На RUN и CMD было достаточно ответов . Я просто хочу добавить несколько слов на ENTRYPOINT . Аргументы CMD могут быть перезаписаны аргументами командной строки, тогда как ENTRYPOINT аргументы всегда используются.
Эта статья является хорошим источником информации.
источник
Существующие ответы охватывают большую часть того, что нужно каждому, кто смотрит на этот вопрос. Поэтому я просто расскажу о некоторых нишевых областях для CMD и RUN.
CMD: дубликаты разрешены, но бесполезны
GingerBeer делает важное замечание: вы не получите никаких ошибок, если вставите более одного CMD - но это расточительно. Я хотел бы уточнить на примере:
Если вы встроите это в образ и запустите контейнер в этом образе, то, как утверждает GingerBeer, будет учитываться только последняя CMD. Таким образом, вывод этого контейнера будет:
Я думаю об этом так: «CMD» устанавливает одну глобальную переменную для всего создаваемого образа, поэтому последовательные операторы «CMD» просто перезаписывают любые предыдущие записи в эту глобальную переменную, а в конечном образе, который построен последний, кто пишет, побеждает. Поскольку Dockerfile выполняется в порядке сверху вниз, мы знаем, что самый нижний CMD - это тот, кто получает эту последнюю «запись» (в переносном смысле).
RUN: команды могут не выполняться, если изображения кэшируются
Тонкий момент, на который следует обратить внимание в отношении RUN, - это то, что он рассматривается как чистая функция, даже если есть побочные эффекты, и, следовательно, кешируется. Это означает, что если RUN имел некоторые побочные эффекты, которые не изменяют результирующее изображение, и это изображение уже было кэшировано, RUN больше не будет выполняться, поэтому побочные эффекты не будут возникать при последующих сборках. Например, возьмем этот Dockerfile:
При первом запуске вы получите такой вывод с разными буквенно-цифровыми идентификаторами:
Обратите внимание, что оператор echo был выполнен выше. Второй раз, когда вы запускаете его, он использует кеш, и вы не увидите никакого эха в выходных данных сборки:
источник