【问题标题】:Celery tasks don't run in docker container芹菜任务不在 docker 容器中运行
【发布时间】:2021-05-08 23:31:40
【问题描述】:

在 Django 中,当用户在 /media 中上传新文件时,我想执行 Celery 任务(假设添加 2 个数字)。我所做的是使用signals,因此当保存关联的上传对象时,将触发芹菜任务。

这是我的代码和 Docker 配置:

signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver
from core.models import Upload
from core.tasks import add_me

def upload_save(sender, instance, signal, *args, **kwargs):
    print("IN UPLOAD SIGNAL") # <----- LOGS PRINT UP TO HERE, IN CONTAINERS
    add_me.delay(10)    

post_save.connect(upload_save, sender=Upload) # My post save signal

tasks.py

from celery import shared_task

@shared_task(ignore_result=True, max_retries=3)    
def add_me(upload_id):
    print('In celery') # <----- This is not printed when in Docker!
    return upload_id + 20

views.py

class UploadView(mixins.CreateModelMixin, generics.GenericAPIView):

    serializer_class = UploadSerializer

    def post(self, request, *args, **kwargs):
        serializer = UploadSerializer(data=request.data)
        print("SECOND AFTER")
        print(request.data) <------ I can see my file name here
        if serializer.is_valid():
            print("THIRD AFTER") <------ This is printer OK in all cases
            serializer.save()
            print("FOURTH AFTER") <----- But this is not printed when in Docker!
            return response.Response(
                {"Message": "Your file was  uploaded"},
                status=status.HTTP_201_CREATED,
            )

        return response.Response(
            {"Message": "Failure", "Errors": serializer.errors},
            status=status.HTTP_403_FORBIDDEN,
        )

docker-compose.yml

version: "3.8"
services:
  db:
    # build: ./database_docker/
    image: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: test_db
      POSTGRES_USER: test_user
      POSTGRES_PASSWORD: test_pass
    # volumes:
    #   - media:/code/media

  web:
    build: ./docker/
    command: bash -c "python manage.py migrate --noinput && python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/code
      - media:/code/media
    ports:
      - "8000:8000"
    depends_on:
      - db

  rabbitmq:
    image: rabbitmq:3.6.10
    volumes:
      - media:/code/media

  worker:
    build: ./docker/
    command: celery -A example_worker worker --loglevel=debug -n worker1.%h
    volumes:
      - .:/code
      - media:/code/media
    depends_on:
      - db
      - rabbitmq
volumes:
  media: 

Dockerfile

FROM python:latest
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip3 install -r requirements.txt
COPY . /code/
WORKDIR /code

不在 Docker 中时一切正常。

问题是,当我在 Docker 中部署上述内容并尝试上传文件时,即使该文件已上传到 media 文件夹中,请求也永远不会完成(通过访问其两个文件中的内容来确认) webworker 容器)。

更具体地说,Celery 任务似乎没有执行(完成?),serializer.save() 之后的代码从未到达。

当我删除信号时(因此不会触发 Celery 任务),一切正常。有人可以帮我吗?

【问题讨论】:

    标签: django docker django-rest-framework docker-compose


    【解决方案1】:

    我刚刚想通了。原来我需要在我的应用程序的__init__.py 中添加以下内容。

    from .celery import app as celery_app
    
    __all__ = ("celery_app",)
    

    不知道为什么在我不使用容器的时候没有这段代码一切都可以顺利运行...

    【讨论】:

      猜你喜欢
      • 2022-01-27
      • 2019-01-15
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 2020-05-06
      • 2020-10-07
      相关资源
      最近更新 更多