Конфигурация Docker Celery — для проекта Django/React/Redis/Celery. Не отображается логотип Celery и журнал фоновых задач

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

Это основано на этом примере учебного кода 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 <-- Руководство по части 4 для Celery и Redis

Вот docker-compose.yaml для части Redis и сельдерея:

# 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

вот как я реализовал фоновые задачи в user_api/tasks.py (https://github.com/axilaris/dockerize-django-react-celery-redis/blob/main/backend/user_api/tasks.py)

in backend/user_api/tasks.py

from __future__ import absolute_import, unicode_literals

from celery import shared_task
import logging

@shared_task
def add(x, y):
    logging.debug("XXX add")
    return x + y

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

 docker-compose build
 docker-compose up

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

Он не напечатал этот логотип сельдерея. (вы можете проверить полные распечатки журналов для составления докеров — https://gist.github.com/axilaris/a2776fc8f39e53bbc93e0d7a4e0ba0f5):

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 нет печати журналов фоновой задачи. (вы можете найти полные распечатки журнала https://gist.github.com/axilaris/a2776fc8f39e53bbc93e0d7a4e0ba0f5)

>>> % 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>>

Моя цель — увидеть этот логотип сельдерея выше и проверить в журналах django, что фоновый процесс выполняется так же, как в (https://thewikihow.com/video_oBQxFn1CDno?si=58ZRfLZeuCC8fz01&t=1204 в 20:04). .

ОБНОВЛЕНИЕ (на основе Суджая)

  • 2 изменения:
    • монтируем django и сельдерей в docker-compose.yaml
    • измените CMD на запуск ["/app/entrypoint.sh"] в django DockerFile
  • результат (см. логи здесь):
    • Появляется логотип сельдерея! Я думаю, что все идет хорошо
    • Выход из контейнера django из-за отказа в разрешении inputpoint.sh. Я даже пытался дать разрешение, но не помогло.

Это выглядит многообещающе, но ошибка контейнера django, из-за которой я не могу выполнить действие № 2, которое является фоновой задачей.

  • Я проверяю этот код здесь в отдельной ветке, если кто-то захочет проверить.

Можете ли вы отредактировать вопрос, включив в него минимальный воспроизводимый пример? Ссылка на ваш репозиторий полезна, но это не единственный способ включить такие ключевые детали, как ваш Dockerfile. Если рабочий контейнер не печатает баннер Celery, что он печатает? Похоже, что монтирование volumes: перезаписывает исходный код вашего приложения, что может привести к различным несоответствиям; удаление поможет?

David Maze 13.03.2024 11:58

Я добавил немного больше информации о коде задачи и распечатках журналов из docker-compose и отдельного контейнера, вызывающего выполнение фоновой задачи gist.github.com/axilaris/a2776fc8f39e53bbc93e0d7a4e0ba0f5. кстати, довольно просто отключить докер с помощью сборки docker-compose и выше.

Axil 13.03.2024 13:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
188
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

В любом случае, вот через что я прошел.

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

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

  • создание контейнера сельдерея прошло успешно
  • сельдерей запускает рабочего Gunicorn ([2024-03-13 12:27:32 +0000] [10] [ИНФО] Запуск Gunicorn 20.1.0).
  • В журналах нет ошибок, связанных с Celery.

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

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

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

Журналы показывают, что успешное выполнение фоновых задач, скорее всего, связано с возвратом результата result.ready.

Отчет об ошибках:

Я вижу, что вы включили режим отладки в своем docker-compose.yaml файле, и рекомендую проверить журналы сельдерея 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

также не забудьте настроить сельдерей при запуске следующим образом:

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, в моем случае я установил их в файле настроек.

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

Ответ принят как подходящий

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

docker-compose build 

Во-первых, вам нужно понять, как докер работает с django и сельдереем: так что ваши докер-сервисы

  1. Бэкэнд
  2. сельдерей

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

теперь, когда вы копируете данные Django в контейнер докеров увидимся, файл Docker для серверной части, он копируется в каталог приложения команда в докере -

COPY . /app

и в файле создания докера у вас есть конфигурация тома как

 - .:/django

поэтому все ваши директории должны быть упрощены

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

    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"]

затем измените файл, созданный докером, на

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["команда"] чтобы он не выполнялся при сборке и скорректированные тома в docker-compose указывают на тот же том, что и сборка

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

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

1)https://thewikihow.com/video_mScd-Pc_pX0&ab_channel=LondonAppDeveloper

2)https://thewikihow.com/video_EfWa6KH8nVI&ab_channel=PriyanshuGupta

о, у тебя получилось, скоро попробую!

Axil 21.03.2024 13:21

Теперь я вижу логотип сельдерея gist.github.com/axilaris/8bc514ed9ec3b0da4a06afda1180695b. Однако серверная часть Django не работает. backend_container не работает. Вот ошибка backend_container | exec /app/entrypoint.sh: разрешение отклонено

Axil 21.03.2024 13:45

Я создал ветку, в которой есть изменения вашего кода. вы можете проверить, правильно ли это. Я даже пытался дать разрешение вот так: RUN chmod +x /app/entrypoint.sh, но это не помогло. github.com/axilaris/dockerize-django-react-celery-redis/tree‌​/…

Axil 21.03.2024 14:23

видимо у меня нет этой проблемы!

Sujay S Badge 22.03.2024 14:51

у меня нет этой проблемы, кстати! у меня все работает нормально, localhost: 8000/admin работает нормально, вы можете попробовать передать право собственности на всю папку, попробуйте перед тем, как dir 'RUN chmod -R +x /app'

Sujay S Badge 22.03.2024 14:58

попробуйте, какие разрешения имеет точка входа с помощью «ls -l enterpoint.sh», чтобы узнать, какие права она должна иметь -rwxr-xr-x

Sujay S Badge 23.03.2024 09:14

Я попробовал «RUN ls -l enterpoint.sh» или «RUN ls -l /app/entrypoint.sh», в журналах ничего не отображается. Можете ли вы описать, как устранить неполадку?

Axil 23.03.2024 09:22

ох, в самой файловой системе. Я изменил % chmod 755 enterpoint.sh. и это работает!

Axil 23.03.2024 09:26

Как вы думаете, вы можете объяснить, почему ваши изменения сработали? было бы полезно понять. почему .:/django НЕ работало, а это РАБОТАЕТ - ./backend:/app ?

Axil 23.03.2024 09:29

Давайте продолжим обсуждение в чате.

Sujay S Badge 23.03.2024 11:57

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