Задачи Celery django ModuleNotFoundError - PullRequest
0 голосов
/ 26 июня 2019

У меня странная ошибка ModuleNotFoundError.

Я создаю Docker-compose сеть, в которой задачи разделяются между контейнерами общим томом. объем выглядит так:

celery_use
│   celery_config.py
│   tasks.py
│   __init__.py

#  celery_config.py
import os
from celery import Celery

app = Celery(include=('celery_use.tasks',))
#  tasks.py
from celery.utils.log import get_task_logger
from .celery_config import app
import os

logger = get_task_logger(__name__)


@app.task(bind=True, name='process_availability', queue='availability')
def process_availability(self, message):
    print(os.getcwd())
    print(os.listdir())
    from avail.models import AvailabilityConfirmation

мой файл docker-compose выглядит так:

version: '3.3'
services:
  pas-gateway:
    build:
      context: ./
      dockerfile: Dockerfile.pas
    command: bash -c "python appserver.py"
    environment: &env
      - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672
    depends_on:
      - rabbitmq
    ports:
      - 18000:8000
    restart: 'no'
    volumes:
      - ./pas_gateway:/pas_gateway
      - ./celery_use:/pas_gateway/celery_use/

  django:
    build:
      context: ./
      dockerfile: Dockerfile.django
    command: python manage.py runserver 0.0.0.0:8001
    ports:
      - 18001:8001
    environment: *env
    depends_on:
      - rabbitmq
      - postgres
    volumes:
      - ./ops_interface:/code

  django-celery:
    build:
      context: ./
      dockerfile: Dockerfile.django
    command: bash -c "celery worker --app=celery_use.celery_config:app --concurrency=20 --queues=availability --loglevel=INFO"
    environment: *env
    depends_on:
      - rabbitmq
      - postgres
    volumes:
      - ./ops_interface:/code
      - ./celery_use:/code/project/celery_use

  postgres:
    image: postgres
    ports:
      - "15432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data

  rabbitmq:
    image: rabbitmq:3.7.8


volumes:
  postgres-data:

Dockerfile.django выглядит так

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY ./requirements.txt /code/
RUN pip install -r requirements.txt
COPY ./ops_interface/ /code/
WORKDIR /code/project/

Итак, включая общий том, структура моего каталога проекта django выглядит следующим образом

project
│   db.sqlite3
│   manage.py
│   __init__.py
│
├───avail
│   │   admin.py
│   │   apps.py
│   │   models.py
│   │   tests.py
│   │   views.py
│   │   __init__.py
│
├───celery_use
│   │   tests.py
│   │   views.py
│   │   __init__.py
│
└───project
    │   settings.py
    │   urls.py
    │   wsgi.py
    │   __init__.py

Я могу поместить очередь в задание из моего контейнера pas-gateway следующим образом:

from celery_use.tasks import process_availability
process_availability.s('testmessage').delay()

Учитывая, что моя задача на данный момент выполняет только три вещи: 1) распечатать cwd 2) распечатать содержимое текущего каталога 3) попытаться импортировать из подкаталога 'util' Вот выход из джанго-сельдерея

[2019-06-26 13:27:49,978: WARNING/ForkPoolWorker-16] /code/project
[2019-06-26 13:27:49,982: WARNING/ForkPoolWorker-16] ['avail', 'celery_use', 'db.sqlite3', 'manage.py', 'project', 'test_module.py', '__init__.py']
[2019-06-26 13:27:49,987: ERROR/ForkPoolWorker-16] Task process_availability[b4f312bd-4220-4c98-a874-6eded7a402b5] raised unexpected: ModuleNotFoundError("No module named 'avail'")
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/celery/app/trace.py", line 382, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/celery/app/trace.py", line 641, in __protected_call__
    return self.run(*args, **kwargs)
  File "/code/project/celery_use/tasks.py", line 14, in process_availability
    from avail.models import AvailabilityConfirmation
ModuleNotFoundError: No module named 'avail'

Я не знаю, почему нет модуля «Сути»

...