Повторное использование приложения Cloudfoundry без необходимости повторной сборки с помощью sratch

Я развертываю приложение Django с Cloudfoundry. Сборка приложения занимает некоторое время, однако мне нужно запускать приложение с разными командами запуска, и единственное решение, которое у меня есть сегодня, - это полностью перестраивать приложение каждый раз.

С помощью Docker изменить команду запуска очень просто, и не нужно перестраивать весь контейнер, должен быть более эффективный способ сделать это:

Вот запущенные приложения:

  • FrontEndApp-Prod: Приложение Django с использованием gunicorn
  • OrchesterApp-Prod: Django Celery Camera и Heartbeat
  • WorkerApp-Prod: Рабочие Django Celery

Все эти приложения в основном идентичны, они просто используют разные маршруты, конфигурации и команды запуска.

Ниже приведен файл manifest.yml, который я использую:

defaults: &defaults
  timeout: 120
  memory: 768M
  disk_quota: 2G
  path: .
  stack: cflinuxfs2
  buildpack: https://github.com/cloudfoundry/buildpack-python.git
  services:
  - PostgresDB-Prod
  - RabbitMQ-Prod
  - Redis-Prod

applications:

- name: FrontEndApp-Prod
  <<: *defaults
  routes:
  - route: www.myapp.com
  instances: 2
  command: chmod +x ./launch_server.sh && ./launch_server.sh

- name: OrchesterApp-Prod
  <<: *defaults
  memory: 1G
  instances: 1
  command: chmod +x ./launch_orchester.sh && ./launch_orchester.sh
  health-check-type: process
  no-route: true

- name: WorkerApp-Prod
  <<: *defaults
  instances: 3
  command: chmod +x ./launch_worker.sh && ./launch_worker.sh
  health-check-type: process
  no-route: true

Почему вы не запускаете три приложения по отдельности? Разве они не работают одновременно? Добавьте дополнительные сведения о том, как должна выглядеть система. Это с циклом DevOps?

data_henrik 09.08.2018 12:10

Я абсолютно могу сделать то, что вы говорите. Однако для меня это все еще неоптимально. Все они используют один и тот же «контейнер», только что выполненный с другой командой запуска. Я уверен, что смогу создать шаблон, а затем изменить команду запуска, маршрут, память, количество экземпляров в соответствии с потребностями приложения.

Jonathan DEKHTIAR 09.08.2018 12:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
175
1

Ответы 1

Я могу придумать для этого два варианта:

  1. Вы можете использовать некоторые из новых функций API v3 и воспользоваться их поддержкой для нескольких процессов в Procfile. С этим у вас, по сути, будет Profile, подобный этому:

    web: ./launch_server.sh
    worker: ./launch_orchester.sh
    worker: ./launch_worker.sh
    

    Затем платформа должна подготовить ваше приложение один раз, но развернуть его три раза в зависимости от капли, полученной в результате размещения. Это красиво, потому что в итоге вы получаете только одно приложение, в котором запущено несколько процессов. Недостатком является то, что на момент написания этой статьи это экспериментальный API, поэтому у него все еще есть некоторые шероховатости, плюс точная поддержка, которую вы получаете, может варьироваться в зависимости от того, как быстро ваш поставщик CF устанавливает новые версии API Cloud Controller.

    Вы можете прочитать все подробности об этом здесь:

    https://www.cloudfoundry.org/blog/build-cf-push-learn-procfiles/

  2. Вы можете использовать cf local. Это плагин cf cli, который позволяет вам создавать дроплет локально (постановка выполняется в контейнере докера на вашем локальном компьютере). Затем вы можете взять эту каплю и развернуть ее столько, сколько захотите.

    Процесс будет выглядеть примерно так, вам просто нужно заполнить некоторые параметры / флаги (намекать запустите cf local -h, чтобы увидеть все параметры):

    • cf local stage
    • cf local push FrontEndApp-Prod
    • cf local push OrchesterApp-Prod
    • cf local push WorkerApp-Prod

    Первая команда создаст файл, оканчивающийся на .droplet, в вашем текущем каталоге, последующие три команды развернут этот дроплет у вашего провайдера и запустят его. В конечном итоге у вас должно получиться три приложения, как сейчас, которые все развертываются из одной и той же капли.

    Недостатком является то, что ваша капля является локальной, поэтому вы загружаете ее три раза, по одному разу для каждого приложения.

Я полагаю, у вас также есть третий вариант - просто использовать контейнер докеров. Однако у этого есть свои преимущества и недостатки.

Надеюсь, это поможет!

Другие вопросы по теме