2016-02-17 3 views
1

Я новичок в докере, имеет простой вопрос к файлу док-станции. Мы можем записать точку входа и CMD в файл док-станции. Кажется, что точка входа выполняется во время создания контейнера. И CMD выполняется во время запуска контейнера. Это правда?Разница между cmd и точкой входа в док-файл

+2

Возможный дубликат из [В чем разница между CMD и ENTRYPOINT в файле Docker?] (http://stackoverflow.com/questions/21553353/what-is-the-difference-between-cmd-and-entrypoint-in-a-dockerfile) – Auzias

ответ

5

Не совсем:

ENTRYPOINT настраивает контейнер, который будет работать в качестве исполняемого файла.
Так что это всегда выполнен (или по умолчанию /bin/sh -c есть).

ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred) 
ENTRYPOINT command param1 param2 (shell form) 

командной строки аргументы docker run <image> будут добавлены после того, как все элементы в качестве ехес форме ENTRYPOINT, и будет переопределить все элементы, указанные с помощью CMD.

Форма оболочки предотвращает любые CMD или командную строку запуска аргументов не использовался, но имеет тот недостаток, что ваш ENTRYPOINT будет запущен как субкоманда /bin/sh -c, который не пропускает сигналы.
Это означает, что исполняемый файл не будет PID 1 контейнера и не получит сигналы Unix, поэтому ваш исполняемый файл не получит SIGTERM от docker stop <container>.

Вы можете посмотреть CMD в качестве параметров для ENTRYPOINT.
если нет точки входа (команда по умолчанию - «/bin/sh -c»), CMD может включать исполняемый файл.
Если ENTRYPOINT уже запускает исполняемый файл, то аргументы CMD являются параметрами для этой команды (если docker run используется без дополнительных параметров).


С docker start, как указано в issue 1437, то ENTRYPOINT выполняется, но только с параметрами из CMD (так используется CMD, но вы не можете изменить его параметры самостоятельно в командной строке).
Если вы хотите использовать CMD, вам нужно docker run, а не docker start.

Там на самом деле недавний PR в действии (PR 19746), который позволяет докер команду запуска, чтобы взять дополнительный --cmd (-c) флаг, чтобы указать ЦМД использовать вместо стандартного одного из CMD/EntryPoint.


The Official Dockerfile documentation теперь имеет раздел "Understand how CMD and ENTRYPOINT interact":

  • Dockerfile следует указать, по крайней мере один из CMD или ENTRYPOINT команд.
  • ENTRYPOINT должен быть определен при использовании контейнера в качестве исполняемого файла.
  • CMD следует использовать как способ определения аргументов по умолчанию для команды ENTRYPOINT или для выполнения команды ad-hoc в контейнере.
  • CMD будет отменен при запуске контейнера с альтернативными аргументами.

Это означает, что если ваш Dockerfile не включает в себя:

  • Нет CMD:

    не
    • если нет ENTRYPOINT: ошибка, не допускается
    • ENTRYPOINT exec_entry p1_entry означает /bin/sh -c exec_entry p1_entry
    • ENTRYPOINT ["exec_entry", "p1_entry"] означает exec_entry p1_entry
  • CMD ["exec_cmd", "p1_cmd"] (одна команда, один параметр)

    • если нет ENTRYPOINT: exec_cmd p1_cmd,
    • ENTRYPOINT exec_entry p1_entry означает /bin/sh -c exec_entry p1_entry exec_cmd p1_cmd
    • ENTRYPOINT ["exec_entry", "p1_entry"] среднее s exec_entry p1_entry exec_cmd p1_cmd
  • CMD ["p1_cmd", "p2_cmd"]

    • если нет ENTRYPOINT: p1_cmd p2_cmd
    • ENTRYPOINT exec_entry p1_entry означает /bin/sh -c exec_entry p1_entry p1_cmd p2_cmd (хорошо)
    • ENTRYPOINT [“exec_entry”, “p1_entry”] означает exec_entry p1_entry p1_cmd p2_cmd
  • CMD exec_cmd p1_cmd:

    • если нет ENTRYPOINT: /bin/sh -c exec_cmd p1_cmd
    • ENTRYPOINT exec_entry p1_entry означает /bin/sh -c exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd
    • ENTRYPOINT [“exec_entry”, “p1_entry”] означает exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd
+0

Что делать, если докер начинается? – richard

+0

как entrypoint и cmd выполняются при запуске докера? – richard

+0

@richard Я отредактировал ответ, включив начало докера. – VonC

Смежные вопросы