[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-docker-v-chyom-raznitsa-mezhdu-cmd-i-entrypoint":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},1079,"v-chyom-raznitsa-mezhdu-cmd-i-entrypoint",17,"docker","Docker","🐳","В чём разница между CMD и ENTRYPOINT?","CMD и ENTRYPOINT — это инструкции Dockerfile, определяющие, что будет выполняться при запуске контейнера, но различающиеся поведением при переопределении аргументов.\n\n### CMD — команда по умолчанию\n\nCMD задаёт команду, которая легко переопределяется аргументами `docker run`:\n\n```dockerfile\nFROM eclipse-temurin:17-jre-alpine\nCMD [\"java\", \"-jar\", \"app.jar\"]\n```\n\n```bash\n# Выполнит java -jar app.jar\ndocker run myapp\n\n# CMD полностью заменяется: выполнит \u002Fbin\u002Fsh\ndocker run myapp \u002Fbin\u002Fsh\n```\n\n### ENTRYPOINT — основная команда\n\nENTRYPOINT задаёт основную команду, а аргументы `docker run` добавляются к ней:\n\n```dockerfile\nFROM eclipse-temurin:17-jre-alpine\nENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]\n```\n\n```bash\n# Выполнит java -jar app.jar\ndocker run myapp\n\n# Аргументы добавятся: java -jar app.jar --spring.profiles.active=prod\ndocker run myapp --spring.profiles.active=prod\n```\n\n### Комбинация ENTRYPOINT + CMD\n\nИдиоматический подход: ENTRYPOINT задаёт исполняемый файл, а CMD — аргументы по умолчанию:\n\n```dockerfile\nFROM eclipse-temurin:17-jre-alpine\nENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]\nCMD [\"--spring.profiles.active=dev\"]\n```\n\n```bash\n# Выполнит java -jar app.jar --spring.profiles.active=dev\ndocker run myapp\n\n# CMD заменяется: java -jar app.jar --spring.profiles.active=prod\ndocker run myapp --spring.profiles.active=prod\n```\n\n### Формы записи\n\n| Форма | Синтаксис | PID 1 | Сигналы ОС |\n|---|---|---|---|\n| Exec-форма (рекомендуется) | `ENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]` | Процесс Java | Доходят напрямую |\n| Shell-форма | `ENTRYPOINT java -jar app.jar` | `\u002Fbin\u002Fsh -c` | Не доходят до Java |\n\nShell-форма оборачивает команду в `\u002Fbin\u002Fsh -c`, из-за чего Java-процесс не получает PID 1 и сигналы ОС (SIGTERM) не доходят до приложения напрямую. Это приводит к проблемам с graceful shutdown.\n\n> **На собеседовании:** ключевое различие: CMD легко переопределяется целиком, а к ENTRYPOINT аргументы добавляются. Идиоматический подход — комбинация ENTRYPOINT + CMD. Обязательно упомяните exec-форму и проблему PID 1 при shell-форме — это показывает production-опыт.","","middle",[15,16,17,7],"entrypoint","dockerfile","cmd",[],null,{"title":21,"description":22,"ogTitle":23,"ogDescription":24,"keywords":25,"schemaAnswer":33,"featuredSnippetReady":34},"Разница между CMD и ENTRYPOINT в Docker — Gymterview","CMD vs ENTRYPOINT в Dockerfile: CMD переопределяется целиком, к ENTRYPOINT аргументы добавляются. Комбинация, exec-форма, проблема PID 1 и shell-форма.","CMD vs ENTRYPOINT в Docker: ключевые различия — Gymterview","Разница CMD и ENTRYPOINT: переопределение, комбинация, exec vs shell форма, проблема PID 1 при shell-форме.",[26,27,28,29,30,31,8,32],"CMD vs ENTRYPOINT","Dockerfile CMD","Dockerfile ENTRYPOINT","exec-форма","shell-форма","PID 1","собеседование","CMD задаёт команду по умолчанию, которая полностью заменяется аргументами docker run. ENTRYPOINT задаёт основную команду, а аргументы docker run добавляются к ней. Идиоматический подход — комбинация: ENTRYPOINT задаёт исполняемый файл, CMD — аргументы по умолчанию. Рекомендуется exec-форма (JSON-массив), так как shell-форма оборачивает команду в \u002Fbin\u002Fsh -c и SIGTERM не доходит до Java-процесса (проблема PID 1).",true]