Комментарии 3
По поводу команды запуска приложений через CMD, по-моему мнению это неверно.
Есть образы в которых shell намеренно отсутствует. Поэтому в вашем же примере лучше запускать команду Java в dockerfile через entrypoint [java, ...], а остальные параметры передавать через env переменные.
Иногда могут возникнуть проблемы с sigterm обработкой через запуск java приложения через cmd, поскольку pid приложения не будет равен 1. Это ещё один аргумент за использование entrypoint напрямую.
Мне кажется, что Вы немного заблуждаетесь и не до конца понимаете, как работают exec и shell формы в инструкциях ENTRYPOINT и CMD. :) p.s Предлагаю оставить этот вопрос (дабы не разводить "холивар") за рамками данного обсуждения.
Для запуска наших контейнеров (с Java) мы используем инструкцию CMD в executable form.
Хочу подчеркнуть, что именно exec form, а не shell form.
Именно поэтому основной процесс (в контейнере) с PID 1 будет java, а не shell оболочка в которой запускается команда java -jar ...
См. вывод команды ps aux
в контейнере с приложением:
~ $ ps aux
PID USER TIME COMMAND
1 app 19:18 java -jar app.jar
Согласен, что не все оболочки умеют их обрабатывать, а где-то её вовсе может и не быть, например в scratch images.
Но опять же хочу сказать, что мы используем exec form инструкции CMD.
Спасибо за ответ. Полностью согласен с вами, просто не каждый знает такие особенности команд в docker.
Я и не хотел разводить холивар. Считаю что для начинающих этот момент стоит подсветить, чтобы у них не возникло ощущения, что сделали всё верно, но что-то пошло не так.
Думаю, что каждый, кто прочитает ваш ответ, сделает для себя выводы и выберет то решение, которое ему больше нравится или подходит под конкретный кейс.
Чеклист для запуска или миграции приложений в Kubernetes