Конфигурация 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
- Backend
- 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