У меня странная ошибка 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'
Я не знаю, почему нет модуля «Сути»