Dockerfile

  • RUN: В основном используемый для создания образов и установки приложений и пакетов, создает новый слой поверх существующего образа, фиксируя результаты.
  • CMD: Устанавливает параметры по умолчанию, которые можно переопределить из интерфейса командной строки Docker (CLI) при запуске контейнера.
  • ENTRYPOINT: Параметры по умолчанию, которые нельзя переопределить, когда контейнеры Docker запускаются с параметрами CLI.
  • В общем случае у вас должен быть Dockerfile CMD, а не Compose command:. Если не определить ни одной из них, то получите сообщение об ошибке.
  • В идеале отдельно указывать исполяемый бинарник в 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]

  • Если используется режим 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 — запустить процесс (это и будет процесс, вокруг которого построен контейнер)
# Используем за основу контейнера 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"] 

Ссылки