Как запустить Python Django и Celery с помощью docker-compose?

У меня есть приложение Python, использующее Джанго и Celery, и я пытаюсь запустить его, используя докер и докер-сочинять, потому что я также использую Redis и Dynamodb

Проблема в следующем:

Я не могу выполнить обе службы WSGI и Сельдерей, потому что только первая инструкция работает нормально ..

version: '3.3'

services:
  redis:
    image: redis:3.2-alpine
    volumes:
      - redis_data:/data
    ports:
      - "6379:6379"
  dynamodb:
    image: dwmkerr/dynamodb
    ports:
      - "3000:8000"
    volumes:
      - dynamodb_data:/data
  jobs:
    build:
      context: nubo-async-cfe-seces
      dockerfile: Dockerfile
    environment:
      - REDIS_HOST=redisrvi
      - PYTHONUNBUFFERED=0
      - CC_DYNAMODB_NAMESPACE=None
      - CC_DYNAMODB_ACCESS_KEY_ID=anything
      - CC_DYNAMODB_SECRET_ACCESS_KEY=anything
      - CC_DYNAMODB_HOST=dynamodb
      - CC_DYNAMODB_PORT=8000
      - CC_DYNAMODB_IS_SECURE=False

    command: >
      bash -c "celery worker -A tasks.async_service -Q dynamo-queue -E --loglevel=ERROR &&
               uwsgi --socket 0.0.0.0:8080 --protocol=http --wsgi-file nubo_async/wsgi.py"
    depends_on:
      - redis
      - dynamodb
    volumes:
      - .:/jobs
    ports:
      - "9090:8080"
volumes:
  redis_data:
  dynamodb_data:

У кого-нибудь была такая же проблема?

Это скорее архитектурное замечание, но я считаю, что вам нужно создавать отдельные службы для частей приложений jobs и web. В jobs вы запускаете celery worker и т.д., в сервисе web - uwsgi ...., поскольку вы не следуете правилу «1 процесс - 1 контейнер». Кстати, что вы видите в docker-compose logs -f jobs?

Satevg 30.10.2018 13:28

Журналы @Satevg показывают только информацию о процессе Celery и ничего о Django.

Anderson K 30.10.2018 13:38

Вы можете попробовать использовать точку с запятой вместо &&. См. unix.stackexchange.com/a/187148 Может быть, сельдерей не возвращает код успеха, но это другая проблема

Satevg 30.10.2018 13:49

@Satevg, ваш первый комментарий дал мне ответ здесь: ruddra.com/docker-do-stuff-using-celery-using-redis-as-broke‌ r - это пример того, что вы упомянули, мне нужно разделить службы. Спасибо за совет!

Anderson K 30.10.2018 13:55

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

Satevg 30.10.2018 13:57

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

Anderson K 30.10.2018 14:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
3 438
2

Ответы 2

Вот docker-compose, предложенный @Satevg, запускает приложение Django и Celery в отдельных контейнерах. Работает отлично!

version: '3.3'

services:
  redis:
    image: redis:3.2-alpine
    volumes:
      - redis_data:/data
    ports:
      - "6379:6379"
  dynamodb:
    image: dwmkerr/dynamodb
    ports:
      - "3000:8000"
    volumes:
      - dynamodb_data:/data
  jobs:
    build:
      context: nubo-async-cfe-services
      dockerfile: Dockerfile
    environment:
      - REDIS_HOST=redis
      - PYTHONUNBUFFERED=0
      - CC_DYNAMODB_NAMESPACE=None
      - CC_DYNAMODB_ACCESS_KEY_ID=anything
      - CC_DYNAMODB_SECRET_ACCESS_KEY=anything
      - CC_DYNAMODB_HOST=dynamodb
      - CC_DYNAMODB_PORT=8000
      - CC_DYNAMODB_IS_SECURE=False    
    command: bash -c "uwsgi --socket 0.0.0.0:8080 --protocol=http --wsgi-file nubo_async/wsgi.py"
    depends_on:
      - redis
      - dynamodb
    volumes:
      - .:/jobs
    ports:
      - "9090:8080"
  celery:
    build:
      context: nubo-async-cfe-services
      dockerfile: Dockerfile
    environment:
    - REDIS_HOST=redis
    - PYTHONUNBUFFERED=0
    - CC_DYNAMODB_NAMESPACE=None
    - CC_DYNAMODB_ACCESS_KEY_ID=anything
    - CC_DYNAMODB_SECRET_ACCESS_KEY=anything
    - CC_DYNAMODB_HOST=dynamodb
    - CC_DYNAMODB_PORT=8000
    - CC_DYNAMODB_IS_SECURE=False
    command: celery worker -A tasks.async_service -Q dynamo-queue -E --loglevel=ERROR
    depends_on:
    - redis
    - dynamodb
    volumes:
    - .:/jobs
volumes:
  redis_data:
  dynamodb_data:

Немного отредактировал вашу конфигурацию (DRY;)) pastebin.com/Mbz72QyD См. Определение службы jobs

Satevg 30.10.2018 15:39

Вы можете обратиться к docker-compose проекта Салер. Я бы посоветовал позволить celery запускать свой демон только в зависимости от redis как брокера. Смотрите конфигурацию файла docker-compose.yml:

services:
  web:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        STATIC_URL: '/static/'
    restart: unless-stopped
    networks:
      - saleor-backend-tier
    env_file: common.env
    depends_on:
      - db
      - redis

    celery:
        build:
          context: .
          dockerfile: ./Dockerfile
          args:
            STATIC_URL: '/static/'
        command: celery -A saleor worker --app=saleor.celeryconf:app --loglevel=info
        restart: unless-stopped
        networks:
          - saleor-backend-tier
        env_file: common.env
        depends_on:
          - redis

Также обратите внимание на то, что соединение обеих служб с redis устанавливается отдельно environtment vatables, как показано в файле common.env:

CACHE_URL=redis://redis:6379/0
CELERY_BROKER_URL=redis://redis:6379/1

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