Конфигурация Docker Celery - Для проекта Django/React/Redis/Celery. Логотип Celery и фоновый журнал задач не отображаются

Я создал проект в репозитории github, в котором есть Docker, Django, React, Redis, Celery: https://github.com/axilaris/dockerize-django-react-celery-redis. Моя цель - добиться корректной работы Celery с появлением логотипа и печати журнала задач на фоне.

Это основано на этом учебном коде примера Docker - React и Django: https://github.com/dotja/authentication_app_react_django_rest

И пытаюсь использовать Docker - Celery & Redis из этого обучающего кода: https://github.com/veryacademy/docker-mastery-with-django/tree/main/Part-4%20Django%20Postgres%20Redis%20and%20Celery <-- Part 4 tutorial for Celery & Redis

Вот docker-compose.yaml для части redis & celery:

# Redis
  redis:
    image: redis:alpine
    container_name: redis
    ports:
      - "6379:6379"

# celery
  celery:
    restart: always
    build:
      context: ./backend
    command: celery -A backend worker -l DEBUG
    volumes:
      - .:/django
    container_name: celery  
    depends_on:
      - redis
      - backend

мой проект должен работать, если вам нужно проверить:

  • docker-compose build
  • docker-compose up

Однако нет логотипа celery (1), и я не вижу печати логов фонового процесса (2). Я думаю, что он выполняется по мере возвращения result.ready. Но мне нужны эти 2 для полноты картины. (несмотря на то, что result.ready может работать с фоновым заданием celery)

Он не напечатал этот логотип сельдерея.

celery       |  -------------- celery@b755a7cdba8d v5.3.6 (emerald-rush)
celery       | --- ***** ----- 
celery       | -- ******* ---- Linux-6.6.12-linuxkit-aarch64-with 2024-03-02 20:48:06
celery       | - *** --- * --- 
celery       | - ** ---------- [config]
celery       | - ** ---------- .> app:         core:0xffff9bbd7550
celery       | - ** ---------- .> transport:   redis://redis:6379//
celery       | - ** ---------- .> results:     redis://redis:6379/
celery       | - *** --- * --- .> concurrency: 10 (prefork)
celery       | -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
celery       | --- ***** ----- 
celery       |  -------------- [queues]
celery       |                 .> celery           exchange=celery(direct) key=celery

и вот как я выполняю фоновое задание, но в журналах django нет отпечатков логов фонового задания.

>>> % docker exec -it backend_container sh 
>>> /app # python manage.py shell
>>> Python 3.9.18 (main, Jan 27 2024, 07:18:02) 
>>> [GCC 13.2.1 20231014] on linux
>>> Type "help", "copyright", "credits" or "license" for more information.
>>> (InteractiveConsole)
>>> from user_api.tasks import add
>>> result = add.delay(2, 2)
>>> result.ready
<bound method AsyncResult.ready of <AsyncResult: 9046dd90-f44d-4eba-9881-acc0fbc4278a>>

Не уверен, что вы ищете логотип, такой как Redis ASCII логотип, показанный ниже в вашем терминале.

                _._                
           _.-``__ ''-._           
      _.-``    `.  `_.  ''-._      
  .-`` .-```.  ```\/    _.,_ ''-._ 
 (    '      ,       .-`  | `,    )
 |`-._`-...-` __...-.``-._|'` _.-'|
 |    `-._   `._    /     _.-'    |
  `-._    `-._  `-./  _.-'    _.-' 
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-' 
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-' 
      `-._    `-.__.-'    _.-'     
          `-._        _.-'         
              `-.__.-'             

В любом случае, вот через что мне пришлось пройти.

Полный журнал в вашем GitHub Gist показывает, что Celery работает правильно, но он не отображает логотип Celery, потому что это фоновый процесс.

Функциональность сельдерея:

  • создание контейнераcelery успешно
  • celery запускает рабочий gunicorn ([2024-03-13 12:27:32 +0000] [10] [INFO] Starting gunicorn 20.1.0).
  • В логах нет ошибок, связанных с Celery.

Отсутствует логотип сельдерея:

Сама программа Celery не имеет графического интерфейса пользователя (GUI), в котором отображается логотип. Он работает в фоновом режиме, выполняя задачи асинхронно.

Журналы фоновых задач:

В журналах видно, что успешное выполнение фоновых задач вероятно, поскольку возвращается result.ready.

Журналы отладки:

Я вижу, что вы включили режим отладки в вашем docker-compose.yaml файле и рекомендую проверить журналы celery docker-compose logs celery --tail=1000 -f, чтобы проверить отсутствующие журналы.

Пожалуйста, сообщите мне, что вы ожидаете увидеть, например, логотип в формате svg или журналы ASCII, если я что-то упускаю.

Я заметил, что на некоторых машинах я могу запустить celery, только если я укажу также имя рабочего, планировщика, очереди и параллелизма, попробуйте запустить celery следующим образом:

celery worker -A backend --loglevel=info --concurrency=4 -n backend@localhost -Q backend -E -Ofair -B -s backend_schedule

также не забудьте сконфигурировать celery на старте следующим образом:

django.setup()
broker = CELERY_BROKER_URL
backend = CELERY_RESULT_BACKEND
app = Celery('backend')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.broker_url = broker
app.conf.result_backend = backend
app.autodiscover_tasks()

возможно CELERY_BROKER_URL && CELERY_RESULT_BACKEND нужно установить из переменных env, в моем случае я установил их в файле настроек.

Также может быть полезно прикрепить изображение по id и попробовать запустить сельдерей из cli.

Насколько я понимаю, вы хотите, чтобы сельдерей начал работать над

docker-compose build 

Для начала нужно понять, как docker работает с django и celery: поэтому ваши сервисы docker

  1. Backend
  2. celery

оба должны находиться на одном общем томе.

теперь, когда вы копируете данные django в контейнер docker если вы видите в docker файл для backend, он копируется в app dir команда в docker -

COPY . /app

и в файле docker compose у вас есть volume conf как

 - .:/django

так что все ваши диры должны быть упорядочены

сначала измените ваш файл docker следующим образом

    FROM python:3.9-alpine

RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev

RUN pip install --upgrade pip

COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY . /app
WORKDIR /app

COPY ./entrypoint.sh .

CMD ["/app/entrypoint.sh"]

затем измените файл docker-compose на

version: '3.7'

services:
  # Redis
  redis:
    image: redis:alpine
    container_name: redis
    ports:
      - '6379:6379'

  backend:
    volumes:
      - ./backend:/app
      - static:/static
    env_file:
      - .env
    build:
      context: ./backend
    ports:
      - '8000:8000'
    container_name: backend_container

  frontend:
    build:
      context: ./frontend
    volumes:
      - frontend:/app/build
    container_name: frontend_container
  nginx:
    build:
      context: ./nginx
    volumes:
      - static:/static
      - frontend:/var/www/frontend
    ports:
      - '80:80'
    depends_on:
      - redis
      - backend
      - frontend

  # celery
  celery:
    restart: always
    build: ./backend
    command: celery -A backend worker -l info
    volumes:
      - ./backend:/app
    container_name: celery
    depends_on:
      - redis
      - backend

volumes:
  static:
  frontend:

Итак, все, что я изменил, это последнюю строку файла докера на CMD["command"] чтобы она не выполнялась при сборке и настроил тома в docker-compose, чтобы они указывали на тот же том, что и build

ваш ожидаемый результат

Я предлагаю вам посмотреть эти 2 видео

1)https://www.youtube.com/watch?v=mScd-Pc_pX0&ab_channel=LondonAppDeveloper

2)https://www.youtube.com/watch?v=EfWa6KH8nVI&ab_channel=PriyanshuGupta

Вернуться на верх