Я прочитал документы о CMD и ENTRYPOINT

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

Здесь они упомянули в таблице, что «NO CMD и NO ENTYRPOINT не разрешены», но я создал Dockerfile без CMD и ENTRYPOINT, и образ был успешно построен. Скачайте alpine tar отсюда Альпийская смола

Dockerfile

from scratch 
ADD alpine-minirootfs-3.11.2-x86_64.tar.gz /
COPY . /

Создание изображения:

docker build -t test:1 .
Sending build context to Docker daemon  2.724MB
Step 1/3 : from scratch
-----
Successfully tagged test:1

docker run -ti test:1 /bin/sh
/ # 

Это сработало!! Так почему в документации упоминается, что необходимы либо CMD, либо ENTRYPOINT?

7
Ashwani 5 Янв 2020 в 15:05
Потому что это необходимо , если вы просто хотите запустить контейнер , и вам не нужно явно передавать команду, как при выполнении.
 – 
jonrsharpe
5 Янв 2020 в 15:15
Нет, в документах упоминается, что это ошибка.
 – 
Ashwani
5 Янв 2020 в 15:16
Да, как видите, просто docker run test:1. Это ошибка «при запуске контейнера» , а не при его создании.
 – 
jonrsharpe
5 Янв 2020 в 15:18
1
Обратите внимание, что здесь также говорится: 1. Dockerfile should specify at least one of CMD or ENTRYPOINT commands. Не должно! Я согласен с тем, что первая строка в таблице немного сбивает с толку
 – 
AAber
5 Янв 2020 в 15:23
Да, поэтому я запутался и попробовал этот пример, используя Scratch image
 – 
Ashwani
5 Янв 2020 в 15:24

2 ответа

Указание команды в конце командной строки docker run предоставляет (или отменяет) CMD; аналогично, опция docker run --entrypoint предоставляет (или отменяет) ENTRYPOINT. В вашем примере вы дали команду /bin/sh, чтобы у контейнера было что-то сделать; если вы оставите его выключенным, вы получите сообщение об ошибке.

Что касается стиля, ваши файлы Docker почти всегда должны объявлять CMD, если только вы не расширяете базовый образ, который уже запускает приложение автоматически (nginx, tomcat). Это позволит вам docker run изображение и запустить приложение, встроенное в него, без необходимости запоминать более конкретный вызов из командной строки.

1
David Maze 5 Янв 2020 в 15:14
Нет, в документах упоминается, что это ошибка, если мы не укажем CMD или ENTRYPOINT.
 – 
Ashwani
5 Янв 2020 в 15:17
Я знаю, что это «стиль», и мы должны использовать любой из них в Dockerfile, но это не обязательно.
 – 
Ashwani
5 Янв 2020 в 15:18
1
В узнайте, как взаимодействуют CMD и ENTRYPOINT внимательно прочтите четыре пункта: «Dockerfile должен указать хотя бы одну из CMD или ENTRYPOINT команд», «CMD будет отменено при запуске контейнера. с альтернативными аргументами ». Я полагаю, что вы находитесь в ячейке CMD [""], "ВХОДНОЙ ТОЧКИ нет" в матрице.
 – 
David Maze
5 Янв 2020 в 15:25
В таблице указано, что No CMD - No ENTRYPOINT -> error, not allowed
 – 
Ashwani
5 Янв 2020 в 15:33
У вас есть CMD в том месте, где вы находитесь в таблице, это /bin/sh из командной строки.
 – 
David Maze
5 Янв 2020 в 15:34

Следующая строка из документации неверна.

Dockerfile should specify at least one of CMD or ENTRYPOINT commands.

Вероятно, следует сказать -

CMD or ENTRYPOINT is necessary for running a container.

0
Shashank V 5 Янв 2020 в 19:33
Разве это не то, что там написано?
 – 
samthegolden
5 Янв 2020 в 16:16
В настоящее время он говорит, что Dockerfile должен указывать CMD или ENTRYPOINT, а таблица на указанной странице говорит, что отсутствие CMD или ENTRYPOINT в Dockerfile равно error, not allowed. Вы можете явно создать образ докера из Dockerfile без CMD или ENTRYPOINT, как показано OP.
 – 
Shashank V
5 Янв 2020 в 16:19
В документе используется should, не путать с must. Если в базовом образе есть CMD и / или ENTRYPOINT (включая возможные значения по умолчанию, подробно описанные в документе), то нет необходимости добавлять их, если вам не нужно их переопределить.
 – 
Zeitounator
5 Янв 2020 в 17:40
Вот в чем путаница, необязательно иметь CMD или ENTRYPOINT. Утверждение в таблице неверно.
 – 
Ashwani
5 Янв 2020 в 19:29