Что будет, если использовать CMD и ENTRYPOINT одновременно

Ответ

При одновременном использовании CMD и ENTRYPOINT в Dockerfile, CMD становится аргументами для команды, указанной в ENTRYPOINT. Если ENTRYPOINT задан как exec-форма (["executable", "param1"]), то CMD добавляет параметры. Если ENTRYPOINT не указан, CMD определяет команду для запуска.

Пример:

ENTRYPOINT ["echo", "Hello"]
CMD ["World"]

При запуске контейнера без аргументов выведет: Hello World. Если передать аргументы (docker run <image> John), выведет: Hello John (CMD игнорируется).

Ответ 18+ 🔞

Ну вот, опять про эту вашу Docker-магию. Слушай, тут всё просто, как три копейки, если не заморачиваться. Представь, что ENTRYPOINT — это твой главный начальник, который всегда приходит на работу первым и садится за свой стол. А CMD — это его ежедневный планёрка, список дел на день по умолчанию.

Так вот, когда они работают вместе, начальник (ENTRYPOINT) всегда выполняет свою основную работу, а список дел (CMD) он просто берёт и делает после неё. То есть, CMD становится просто дополнительными аргументами для команды-начальника.

Вот смотри на этот пример, тут всё как на ладони:

ENTRYPOINT ["echo", "Hello"]
CMD ["World"]

Что тут происходит? Твой начальник-echo всегда будет кричать "Hello". А его дефолтный план на день (CMD) — это прокричать "World" следом. Запустишь контейнер просто так — получишь Hello World. Всё логично, ёпта.

А теперь самое интересное, где многие охуевают. Если ты при запуске контейнера сам начнёшь орать свои аргументы, типа docker run <image> John, то что будет? А будет тебе Hello John! Потому что твой крик ("John") — это как срочный приказ сверху. И начальник-ENTRYPOINT его выполняет, а его старый, скучный планёрка (CMD ["World"]) летит в пизду, его все сразу забывают. Доверия к планам CMD в такой ситуации — ноль ебать.

Короче, запомни: ENTRYPOINT — это основа, каркас команды, которую не сломаешь. А CMD — это просто предложение по умолчанию, на которое всем похуй, если ты сам что-то сказал. Вот и вся хитрая жопа с этими директивами. Не усложняй, чувак.