Как иметь два рабочих для heroku.yml?

У меня есть следующее heroku.yml. У "контейнеров" одинаковые Dockerfile:

build:
  docker:
    web: Dockerfile
    celery: Dockerfile
    celery-beat: Dockerfile
release:
  image: web
  command:
    - python manage.py migrate users && python manage.py migrate
run:
  web: python manage.py runserver 0.0.0.0:$PORT
  celery: celery --app=my_app worker --pool=prefork --concurrency=4 --statedb=celery/worker.state -l info
  celery-beat: celery --app=my_app beat -l info

Я планировал иметь три контейнера, но оказалось, что Heroku принимает только один web, а второй должен быть workers.

Так что же мне изменить в heroku.yml, чтобы celery и celery-beat были контейнерами worker?

Название worker не имеет особого значения:

Ни один тип процесса, кроме web и release, не имеет специальных свойств

Так что просто дайте им разные имена:

run:
  web: python manage.py runserver 0.0.0.0:$PORT
  celery_worker:
    command:
      - celery --app=my_app worker --pool=prefork --concurrency=4 --statedb=celery/worker.state -l info
    image: web
  celery_beat:
    command:
      - celery --app=my_app beat -l info
    image: web

При масштабировании этих процессов используйте имена celery_worker и celery_beat.

Лучший вариант - объединить celery worker и beat в single worker / command : (можно сделать только на Linux os)

run:
  web: python manage.py runserver 0.0.0.0:$PORT
  celery_worker:
    command:
      - celery --app=my_app worker --pool=prefork --concurrency=4 --statedb=celery/worker.state -l info --beat -l info
    image: web
Вернуться на верх