{{tag>[docker dockerfile]}}

====== Dockerfile ======

===== Инструкции =====


  * **RUN**: В основном используемый для создания образов и установки приложений и пакетов, создает новый слой поверх существующего образа, фиксируя результаты.
  * **CMD**: Устанавливает параметры по умолчанию, которые можно переопределить из интерфейса командной строки Docker (CLI) при запуске контейнера.
  * **ENTRYPOINT**: Параметры по умолчанию, которые нельзя переопределить, когда контейнеры Docker запускаются с параметрами CLI.

<note tip>
  * В общем случае у вас должен быть Dockerfile CMD, а не Compose command:. Если не определить ни одной из них, то получите сообщение об ошибке.
  * В идеале отдельно указывать исполяемый бинарник в ENTRYPOINT и отдельно команды к нему в CMD.
</note>

===== ENTRYPOINT / CMD =====


^ Режим     ^ Пример                            ^ Формат запуска             ^ Завершение работы  ^ $PATH ^
| SHELL     | ENTRYPOINT ping www.ya.ru         | /bin/sh -c ping www.ya.ru  | -                  | [ ]   |
| EXEC :!:  | ENTRYPOINT ["ping", "www.ya.ru"]  | ping www.ya.ru             | CTRL-C             | [x]   |

{{https://habrastorage.org/r/w1560/web/ca2/564/592/ca25645927e9445c9a70475de1be7afc.png?800|}}

==== Правила использования ====

  * Если используется режим shell для ENTRYPOINT, CMD игнорируется.
  * При использовании режима exec для ENTRYPOINT аргументы CMD добавляются в конце.
  * При использовании режима exec для инструкции ENTRYPOINT необходимо использовать режим exec и для инструкции CMD. Если этого не сделать, Docker попытается добавить sh -c в уже добавленные аргументы, что может привести к некоторым непредсказуемым результатам.
  * Инструкции ENTRYPOINT и CMD могут быть переопределены с помощью флагов командной строки.
  * Все вышеперечисленные факты справедливы, но разработчики имеют возможность переопределять флаги в команде docker run

==== Использование ====

  * Используйте ENTRYPOINT, если вы не хотите, чтобы разработчики изменяли исполняемый файл, который запускается при запуске контейнера. Вы можете представлять, что ваш контейнер – исполняемая оболочка.
  * Используйте только CMD (без определения ENTRYPOINT), если требуется, чтобы разработчики могли легко переопределять исполняемый файл. Если точка входа определена, исполняемый файл все равно можно переопределить, используя флаг --entrypoint.

=== command ===

В файле Compose переопределяет CMDDockerfile. Есть некоторые незначительные синтаксические различия (в частности, Compose никогда не будет автоматически вставлять sh -cза вас оболочку оболочки), но они контролируют одно и то же в метаданных контейнера.

Однако помните, что помимо Compose существуют и другие способы запуска контейнера. docker run не прочитает ваш docker-compose.yml файл и не увидит эту command: он также не читается такими инструментами, как Kubernetes. Если вы встроите Dockerfile CMD в, оно будет использовать во всех вариантах.

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

=== endpoint ===

===== Описание =====

  * FROM — указывает название образа (image), который будет взят за основу.
  * ENV — устанавливает переменную среды
  * RUN — запустить команду в контейнере (все команды исполняются с полными правами в пределах контейнера)
  * ADD — добавить файл в контейнер
  * VOLUME — указать монтируемые директории (их можно монтировать на хост машину или на другие контейнеры)
  * EXPOSE — указать транслируемые порты (их можно транслировать на хост машину или на другие контейнеры)
  * CMD — запустить процесс (это и будет процесс, вокруг которого построен контейнер)

<code bash>
# Используем за основу контейнера Ubuntu 14.04 LTS
FROM ubuntu:14.04
# Переключаем Ubuntu в неинтерактивный режим — чтобы избежать лишних запросов
ENV DEBIAN_FRONTEND noninteractive 
# Устанавливаем локаль
RUN locale-gen ru_RU.UTF-8 && dpkg-reconfigure locales 

# Добавляем необходимые репозитарии и устанавливаем пакеты
RUN apt-get install -y software-properties-common
RUN add-apt-repository -y ppa:ondrej/php5-5.6
RUN add-apt-repository -y ppa:nginx/stable
RUN sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4F4EA0AAE5267A6C
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y wget curl php5-fpm php5-mysql php5-gd php5-curl php-pear php-apc php5-mcrypt php5-imagick php5-memcache supervisor nginx

# Добавляем описание виртуального хоста
ADD astgo.ru /etc/nginx/sites-enabled/astgo.ru 
# Отключаем режим демона для Nginx (т.к. запускать будем сами) 
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf 
# Отключаем режим демона для php-fpm
RUN sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" /etc/php5/fpm/php-fpm.conf 
# Добавляем конфиг supervisor (описание процессов, которые мы хотим видеть запущенными на этом контейнере)
ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf 

# Объявляем, какие директории мы будем подключать
VOLUME ["/var/www"] 
# Объявляем, какой порт этот контейнер будет транслировать
EXPOSE 80 
# Запускаем supervisor
CMD ["/usr/bin/supervisord"] 
</code>

====== Ссылки ======

{{topic>[docker]}}