Для рабочих нагрузок (или чего-то важного) вам не нужно помещать несколько логически отдельных процессов в один контейнер. Основная причина в том, что это затрудняет масштабирование вашего приложения. Допустим, ваше приложение становится популярным, и вам нужно больше обработки Django, чтобы справиться с нагрузкой, и с Nginx & Django в одном контейнере вы должны масштабировать оба вместе. Если они являются отдельными приложениями, их можно масштабировать независимо для каждого логического процесса.
Есть и другие болевые точки:
- Управление ЦП и памятью сложнее. У вас есть несколько процессов, конкурирующих за один и тот же пул ресурсов. Это особенно сложно для Java приложений, где JVM любит брать все памяти. Это означает, что вам нужно лучше оценивать, чтобы не исчерпать память, и приложение могло взломать sh.
- Более сложно правильно реагировать на проверки работоспособности. Ваша проверка работоспособности должна точно представлять, что ваше приложение «работает». С несколькими процессами в одном приложении это сложнее.
- Сложно заставить приложение завершиться, когда один из этих процессов умрет. Это похоже на правильную проверку здоровья. Если приложение не завершится полностью, оно не будет перезапущено, и вы можете оставить половину приложения или сломанное приложение, которое не может быть автоматически перезапущено / исправлено.
- У вас есть больше гибкость благодаря двум отдельным приложениям, в частности, вы можете обновлять приложения независимо друг от друга.
В любом случае, если вы все еще думаете, что хотите вставить оба в одно приложение, у вас есть несколько вариантов.
Вы можете просто взять под контроль команду запуска с помощью cf push -c
или добавив command:
в manifest.yml. Это позволит вам переопределить команду, установленную в финальной сборке. Просто будьте осторожны, так как он полностью переопределит то, что установлено в buildpack, поэтому вам действительно нужно знать правильную команду для вызова, иначе ваше приложение не запустится (это особенно сложно с приложениями Java, где команда start может быть сложной) .
Вы можете поместить файл .profile
в root каталога вашего приложения (т. Е. Там, где вы установили cf push -p
). Этот скрипт будет выполняться до команды, установленной в финальном пакете сборки, и вы можете использовать его для запуска других процессов в фоновом режиме.
Как уже упоминалось выше, получить оба процесса особенно сложно правильно выйти при использовании методов выше. Это один хак, который я нашел, который помогает:
#!/bin/bash
set -e
run_second_process() {
# insert the command to run the second process here
# it should run and keep running (i.e. foreground)
nginx -c nginx.conf
# should never get to here, if it does the app crashed
pkill python # insert name of your primary process
# now we are all dead and the container will restart
}
# runs the second process in the background
# that is important otherwise the primary process will never run
run_updater &
Вам нужно будет найти способы обойти другие недостатки или просто переключиться на использование нескольких приложений. Надеюсь, это поможет!