Я создал репозиторий проекта на 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). .
ОБНОВЛЕНИЕ (на основе Суджая)
Это выглядит многообещающе, но ошибка контейнера django, из-за которой я не могу выполнить действие № 2, которое является фоновой задачей.
Я добавил немного больше информации о коде задачи и распечатках журналов из docker-compose и отдельного контейнера, вызывающего выполнение фоновой задачи gist.github.com/axilaris/a2776fc8f39e53bbc93e0d7a4e0ba0f5. кстати, довольно просто отключить докер с помощью сборки docker-compose и выше.





Не уверен, что вы ищете такой логотип Redis ASCII, как показано ниже, в своем терминале.
_._
_.-``__ ''-._
_.-`` `. `_. ''-._
.-`` .-```. ```/ _.,_ ''-._
( ' , .-` | `, )
|`-._`-...-` __...-.``-._|'` _.-'|
| `-._ `._ / _.-' |
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
В любом случае, вот через что я прошел.
Полные журналы в вашем GitHub Gist показывают, что Celery работает правильно, но не отображает логотип 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 и сельдереем: так что ваши докер-сервисы
оба должны находиться на одном общем томе.
теперь, когда вы копируете данные 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
о, у тебя получилось, скоро попробую!
Теперь я вижу логотип сельдерея gist.github.com/axilaris/8bc514ed9ec3b0da4a06afda1180695b. Однако серверная часть Django не работает. backend_container не работает. Вот ошибка backend_container | exec /app/entrypoint.sh: разрешение отклонено
Я создал ветку, в которой есть изменения вашего кода. вы можете проверить, правильно ли это. Я даже пытался дать разрешение вот так: RUN chmod +x /app/entrypoint.sh, но это не помогло. github.com/axilaris/dockerize-django-react-celery-redis/tree/…
видимо у меня нет этой проблемы!
у меня нет этой проблемы, кстати! у меня все работает нормально, localhost: 8000/admin работает нормально, вы можете попробовать передать право собственности на всю папку, попробуйте перед тем, как dir 'RUN chmod -R +x /app'
Это не работает. я попробовал «RUN chmod -R +x /app», а также попробовал другой способ forums.docker.com/t/entrypoint-sh-permission-denied-issue/91473 docker-compose build --no-cache . Как у вас это получилось, вы использовали одну и ту же сборку docker-compose/docker-compose up? есть ли способ устранить эту неполадку? меняя CMD, тогда backend_container работает. Могу ли я посмотреть ваши логи? это мои логи gist.github.com/axilaris/5f365fdc8d341e92508848665d24e48d. Не уверен, поможет ли это, я использую MacOS Sanoma 14.0.
попробуйте, какие разрешения имеет точка входа с помощью «ls -l enterpoint.sh», чтобы узнать, какие права она должна иметь -rwxr-xr-x
Я попробовал «RUN ls -l enterpoint.sh» или «RUN ls -l /app/entrypoint.sh», в журналах ничего не отображается. Можете ли вы описать, как устранить неполадку?
ох, в самой файловой системе. Я изменил % chmod 755 enterpoint.sh. и это работает!
Как вы думаете, вы можете объяснить, почему ваши изменения сработали? было бы полезно понять. почему .:/django НЕ работало, а это РАБОТАЕТ - ./backend:/app ?
Давайте продолжим обсуждение в чате.
Можете ли вы отредактировать вопрос, включив в него минимальный воспроизводимый пример? Ссылка на ваш репозиторий полезна, но это не единственный способ включить такие ключевые детали, как ваш Dockerfile. Если рабочий контейнер не печатает баннер Celery, что он печатает? Похоже, что монтирование
volumes:перезаписывает исходный код вашего приложения, что может привести к различным несоответствиям; удаление поможет?