Задачи redis и celery отлично работают без docker, но при использовании docker статус задач всегда находится в состоянии ожидания в моем приложении django
Я пытаюсь написать фоновую задачу для подсчета общего количества постов. Она работает нормально, когда я запускаю сервер redis и celery без использования docker, но при использовании docker состояние задачи всегда находится в состоянии ожидания.
Чтобы подтвердить, что задача работает, я попытался выполнить ее без использования docker, и она работала нормально, но как только я смог запустить ее с помощью docker, задача перестала работать.
Ниже приведен код, который я пробовал:
Dockerfile
FROM python:3.8-slim-buster
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
RUN pip3 install ipdb
COPY . /code/
docker-compose.yml
version: '3'
services:
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: myproject
POSTGRES_USER: myprojectuser
POSTGRES_PASSWORD: password
networks:
- mynetwork
web:
build: .
command: bash -c "
python manage.py migrate
&& python manage.py runserver 0.0.0.0:8000
"
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
- es
- redis
- celery
environment:
- DATABASE_URL=postgres://myprojectuser:password@db:5432/myproject
stdin_open: true # Keep stdin open
tty: true # Enable TTY
networks:
- mynetwork
es:
image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0
volumes:
- esdata01:/usr/share/elasticsearch/data
ports:
- 9200:9200
environment:
- discovery.type=single-node
- xpack.security.enabled=false
networks:
- mynetwork
redis:
image: redis:latest
container_name: rd01
command: redis-server
ports:
- '6379:6379'
networks:
- mynetwork
celery:
build: .
command: celery -A core worker -l info
volumes:
- .:/code
depends_on:
- redis
networks:
- mynetwork
environment:
- CELERY_BROKER=redis://redis:6379/0
- CELERY_RESULT_BACKEND=redis://redis:6379/0
celery-beat:
build: .
command: celery -A core beat --loglevel=info
volumes:
- .:/code
depends_on:
- redis
- celery
networks:
- mynetwork
volumes:
postgres_data:
esdata01:
networks:
mynetwork:
driver: bridge
tasks.py
# myapp/tasks.py
import logging
from celery import shared_task
from .models import Post # Ensure you import the Post model
import pdb
print("Tasks module loaded")
# logger = logging.getLogger(__name__)
@shared_task
def count_posts():
print("count_posts task registered")
count_posts = Post.objects.count()
return count_posts
views.py
def home(request):
result = count_posts.delay()
time.sleep(1)
async_result = AsyncResult(result.id)
if async_result.ready():
total_posts = async_result.get()
return JsonResponse({'total_posts': total_posts})
else:
return JsonResponse({'status': 'pending'})
settings.py
CELERY_BROKER_URL = 'redis://redis:6379/0'
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'
# CELERY_CACHE_BACKEND = 'django-cache'
CELERY_ACCEPT_CONTENT = ['pickle']
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'pickle'
CELERY_TIMEZONE = "UTC"
# CELERY_TASK_TRACK_STARTED = True