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

TakeSoUp

Ответов: 9

Ответы (9)

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

CMD - команда, которую контейнер выполняет по умолчанию при запуске созданного образа. Dockerfile будет использовать только последний определенный CMD. CMD можно переопределить при запуске контейнера с помощью docker run $ image $ other_command.

ENTRYPOINT также тесно связан с CMD и может изменять способ запуска изображения контейнером.

Достаточно ответов на RUN и CMD. Я просто хочу добавить несколько слов о ENTRYPOINT.CMD аргументы могут быть перезаписаны аргументами командной строки, при этом всегда используются аргументы ENTRYPOINT.

Эта статья является хорошим источником информации.

RUN: может быть много, и он используется в процессе build, например установить несколько библиотек

CMD: может иметь только 1, что является вашей начальной точкой выполнения (например, ["npm", "start"], [ «узел», «app.js»])

RUN - команда запускается при сборке образа докера.

CMD - command triggers while we launch the created docker image.

Команда RUN: Команда RUN в основном выполняет команду по умолчанию, когда мы создаем образ. Он также зафиксирует изменения изображения для следующего шага.

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

Команда CMD: Команды CMD просто установят команду по умолчанию для нового контейнера. Это не будет выполнено во время сборки.

Если в docker-файле больше 1 команд CMD, то все они игнорируются, кроме последней. Поскольку эта команда ничего не выполнит, а просто установит команду по умолчанию.

Я нашел эту статью очень полезной, чтобы понять разницу между ними:

РАБОТА - Инструкция RUN позволяет вам установить ваше приложение и пакеты требуется для этого. Выполняет любые команды поверх текущего изображения и создает новый слой, фиксируя результаты. Часто вы найдете несколько инструкций RUN в Dockerfile.

CMD - Инструкция CMD позволяет вам установить команду по умолчанию, которая будет выполняется только при запуске контейнера без указания команды. Если контейнер Docker запускается с командой, команда по умолчанию будет игнорируется. Если Dockerfile содержит более одной инструкции CMD, все, кроме последней
Команды CMD игнорируются.

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

из ссылки на файл докеров

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

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

Существующие ответы покрывают большую часть того, что может понадобиться любому, кто задается вопросом. Я просто рассмотрю некоторые нишевые области для CMD и RUN.

CMD: дубликаты разрешены, но бесполезно

GingerBeer подчеркивает важное замечание: вы не получите никаких ошибок, если введете более одного CMD, но это расточительно. Я хотел бы уточнить пример:

FROM busybox
CMD echo "Executing CMD"
CMD echo "Executing CMD 2"

Если вы встроите это в образ и запустите контейнер в этом образе, то, как утверждает GingerBeer, будет учтена только последняя CMD. Таким образом, вывод этого контейнера будет:

Выполнение CMD 2

• 100001 вот построенный последний, который пишет, побеждает. Поскольку файл Dockerfile выполняется в порядке сверху вниз, мы знаем, что последний CMD получает эту последнюю «запись» (образно говоря).

RUN: команды могут не выполняться, если изображения кэшированы

Следует заметить, что RUN обрабатывается как чистая функция, даже если есть побочные эффекты, и поэтому кэшируется. Это означает, что если RUN имеет некоторые побочные эффекты, которые не изменяют результирующее изображение, и это изображение уже было кэшировано, RUN не будет выполняться снова, и поэтому побочные эффекты не будут возникать при последующих сборках. Например, возьмите этот Dockerfile:

FROM busybox
RUN echo "Just echo while you work"

При первом запуске вы получите такой вывод с разными буквенно-цифровыми идентификаторами:

docker build -t example/run-echo .
Sending build context to Docker daemon  9.216kB
Step 1/2 : FROM busybox
 ---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
 ---> Running in ed37d558c505
Just echo while you work
Removing intermediate container ed37d558c505
 ---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest

Обратите внимание, что оператор echo был выполнен выше. Во второй раз, когда вы запустите его, он использует кеш, и вы не увидите никакого эха в выводе сборки:

docker build -t example/run-echo .
Sending build context to Docker daemon  9.216kB
Step 1/2 : FROM busybox
 ---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
 ---> Using cache
 ---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest

2022 WebDevInsider