в docker, tips

Docker совет №5: Разница между инструкциями RUN и CMD


Инструкции RUN и CMD являются очень важными частями Dockerfile, и они выполняют разные задачи. Давайте разберемся, что они делают!

Эти инструкции выполняются при сборке docker-образа из Dockerfile. RUN позволяет выполнять команды внутри вашего docker-образа — такие команды выполняются только один раз во время сборки и создают новый слой в итоговом docker-образе.

Если вам необходимо установить пакет или создать каталог внутри вашего docker-образа, то инструкция RUN подойдет вам как нельзя лучше. Например:

RUN mkdir -p /var/www/test

или

RUN apt-get update && apt-get -y install libmcrypt-dev curl libmemcached-dev libz-dev \
    libpq-dev libjpeg-dev libpng12-dev libfreetype6-dev libssl-dev libmagickwand-dev \
    zlib1g-dev libicu-dev g++ --no-install-recommends

Инструкция CMD позволяет определить команду по умолчанию, которая будет выполняться при запуске вашего docker-контейнера (запущенный docker-образ называется контейнером). Эта инструкция не выполняется во время сборки!

Например, в Dockerfile для веб-приложения вполне логично добавить инструкцию CMD, которая запустит веб-сервер при старте контейнера, например:

CMD ["php", "-S", "0.0.0.0:9095", "-t", "public", "public/index.php"]

или:

CMD ["/nodejs/bin/node", "/app/server.js"]
HashFlare

Добавить комментарий

  1. ОК)
    Огромное спасибо за тот вклад который ты делаешь в развитие)
    У меня такой вопрос что делает команда docker create и что делает команда docker run ubuntu?

      • Спасибо большое)
        Еще один вопрос
        Всем привет)
        У меня вопрос по докеру)
        Какой процесс можно передать
        docker run -d —name name1 ubuntu
        /bin/bash
        сюда для того чтобы контейнер не умирал ?
        Точнее чтобы контейнер просто работал в фоне)
        И в любое время можно было к нему присоединится)

        • Если честно, это очень странное пожелание )))
          Контейнеры — это не виртуальные машины, не нужно держать постоянно запущенную ubuntu просто «чтоб в любое время подключиться». Обычно в контейнере «живет» какой-нибудь процесс (nginx / redis / sphinxsearch / …), который хорошо выполняет свою работу. Если процесс «умирает» — контейнер может быть перезапущен (в зависимости от настроек restart-policy).

          Если вы уверены, что вам нужен именно контейнер с ubuntu, который, по сути, ничего не делает и просто висит в фоне и ждет пока вы подключитесь, передавайте ему какую-нибудь «вечную» команду — например, пинг хоста / вывод информации в цикле while … true;

          Пример такой команды легко находится в гугле, на первой же странице есть:

          A very simple infinite loop.. 🙂

          while true ; do continue ; done