Search code examples
pythondocker-composerabbitmqcelerydjango-celery

Unable to call "celery status" in Django, RabbitMQ, Celery container on Docker. KeyError: 'No such transport'


I have a docker container setup with Django, where I'd like to use Celery. The broker is RabbitMQ, and for the results backend I'm using django-celery-backend. Once everything is up and running, I get an error if I call celery status Here is my setup:

docker-compose.yml

version: '3.8'

services:
  django:
    build: .
    container_name: django
    command: "python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/usr/src/app/
    ports:
      - "8000:8000"
    environment:
      - DEBUG=1
      - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1
      - CELERY_BROKER= amqp://guest:guest@rabbitmq:5672
    depends_on:
      - rabbitmq
      - pgdb
  
  celery:
    build: .
    container_name: celery
    command: celery -A core worker -l info
    volumes:
      - .:/usr/src/app/
    depends_on:
      - django
      - rabbitmq
  
  pgdb:
    image: postgres
    container_name: pgdb
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
    volumes:
      - pgdata:/var/lib/postgresql/data/
    ports:
      - "5432:5432"

  rabbitmq:
    image: rabbitmq:management
    container_name: 'rabbitmq'
    environment:
      - RABBITMQ_DEFAULT_USER=guest
      - RABBITMQ_DEFAULT_PASS=guest
    ports:
      - 5672:5672
      - 15672:15672

volumes:
  pgdata:

settings.py

CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'amqp://guest:guest@rabbitmq:5672')
CELERY_RESULT_BACKEND = 'django-db'

I am able to send and execute tasks, and everything works fine in that regards. But if I try to call celery status inside of docker, I get the following error message:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/kombu/transport/__init__.py", line 57, in resolve_transport
    transport = TRANSPORT_ALIASES[transport]
                ~~~~~~~~~~~~~~~~~^^^^^^^^^^^
KeyError: ''

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/bin/celery", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/__main__.py", line 15, in main
    sys.exit(_main())
             ^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/bin/celery.py", line 217, in main
    return celery(auto_envvar_prefix="CELERY")
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1055, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/decorators.py", line 26, in new_func
    return f(get_current_context(), *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/bin/base.py", line 134, in caller
    return f(ctx, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/bin/control.py", line 82, in status
    callback=callback).ping()
                       ^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/control.py", line 294, in ping
    return self._request('ping')
           ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/control.py", line 106, in _request
    return self._prepare(self.app.control.broadcast(
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/control.py", line 730, in broadcast
    with self.app.connection_or_acquire(connection) as conn:
  File "/usr/local/lib/python3.11/site-packages/celery/utils/objects.py", line 84, in __enter__
    context = self._context = self.fallback(
                              ^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/base.py", line 892, in _acquire_connection
    return self.pool.acquire(block=True)
           ^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/base.py", line 1206, in pool
    self._pool = pools.connections[self.connection_for_write()]
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/base.py", line 816, in connection_for_write
    return self._connection(url or self.conf.broker_write_url, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/base.py", line 867, in _connection
    return self.amqp.Connection(
           ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/kombu/connection.py", line 181, in __init__
    if not get_transport_cls(transport).can_parse_url:
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/kombu/transport/__init__.py", line 85, in get_transport_cls
    _transport_cache[transport] = resolve_transport(transport)
                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/kombu/transport/__init__.py", line 66, in resolve_transport
    raise KeyError(f'No such transport: {transport}')
KeyError: 'No such transport: '

I am able to call celery status if I use redis instead of RabbitMQ as the broker, but I would rather use RabbitMQ.


Solution

  • transport is a CELERY_BROKER_URL, so check your .env files and Docker ENVIRONMENTS, I think there is a problem.

    Yes, I checked your environment and there is:

    environment:
      - DEBUG=1
      - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1
      - CELERY_BROKER= amqp://guest:guest@rabbitmq:5672
    

    But in settings:

    CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'amqp://guest:guest@rabbitmq:5672')
    CELERY_RESULT_BACKEND = 'django-db'
    

    A solving of your issue:

    Change here:

    CELERY_BROKER_URL = os.environ.get('CELERY_BROKER', 'amqp://guest:guest@rabbitmq:5672')
    CELERY_RESULT_BACKEND = 'django-db'
    

    or here

      django:
    build: .
    container_name: django
    command: "python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/usr/src/app/
    ports:
      - "8000:8000"
    environment:
      - DEBUG=1
      - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1
      - CELERY_BROKER_URL= amqp://guest:guest@rabbitmq:5672
    depends_on:
      - rabbitmq
      - pgdb