Celery недоступен после докеризации в приложении Django

У меня есть приложение Django, которое я пытался докеризировать. Я успешно докеризировал Django с gunicorn и nginx, так что основная часть приложения работает.

Однако у меня также есть задачи, которые нужно запускать с помощью Celery. Я докеризировал rabbitmq, и я думаю, что это было успешно, так как до его установки у меня было Connexion refused и больше нет

Мне не хватает только Celery для докеризации, поэтому, поскольку мои задачи не выполняются и не хранятся в базе данных, моя конфигурация Celery, вероятно, неправильная, однако я не смог найти, где я в ней ошибаюсь.

Вот мой docker-compose.yml:

version: '3.8'

services:
  django_gunicorn:
    volumes:
      - static:/app/static
      - media:/media
    env_file:
      - env
    build:
      context: .
    ports: 
      - "8000:8000"

  nginx:
    build: ./nginx
    volumes:
      - static:/static
      - media:/media
    ports:
      - "80:80"
    depends_on:
      - django_gunicorn

  rabbitmq3:
    image: rabbitmq:3-alpine
    ports:
      - 5672:5672

  celery:
    restart: always
    build:
      context: .
    command: celery -A main worker -l info
    env_file:
      - env
    depends_on:
      - rabbitmq3
      - django_gunicorn


volumes:
  static:
  media:

Dockerfile:

FROM python:3.10.5-alpine

RUN pip install --upgrade pip

RUN wget https://upload.wikimedia.org/wikipedia/commons/b/b9/First-google-logo.gif -O media/media.gif

COPY ./requirements.txt .
RUN pip install -r requirements.txt
COPY ./src /app

WORKDIR /app

COPY ./entrypoint.sh /
ENTRYPOINT ["sh", "/entrypoint.sh"]

entrypoint.sh:

#!/bin/sh

python manage.py migrate
python manage.py collectstatic --no-input

gunicorn main.wsgi:application --bind 0.0.0.0:8000

Я думаю, что причина в том, что ваши контейнеры не могут общаться друг с другом. По умолчанию все контейнеры находятся в мостовой сети, и возникает эта проблема. Вы можете попробовать сгруппировать все контейнеры в сеть, как показано ниже.

version: '3.8'

services:
  django_gunicorn:
    volumes:
      - static:/app/static
      - media:/media
    env_file:
      - env
    build:
      context: .
    ports: 
      - "8000:8000"
    networks:
      - dev_network

  nginx:
    build: ./nginx
    volumes:
      - static:/static
      - media:/media
    ports:
      - "80:80"
    depends_on:
      - django_gunicorn
    networks:
      - dev_network

  rabbitmq3:
    image: rabbitmq:3-alpine
    ports:
      - 5672:5672
    networks:
      - dev_network

  celery:
    restart: always
    build:
      context: .
    command: celery -A main worker -l info
    env_file:
      - env
    depends_on:
      - rabbitmq3
      - django_gunicorn
    networks:
      - dev_network

networks:
  dev_network:
    external: false

volumes:
  static:
  media:

А в конфигурации celery для URL брокера нужно указать его в таком формате.

amqp://username:password@rabbitmq3:5672/

в вашем entrypoint.sh добавьте следующую строку в конце, чтобы команды docker-compose также выполнялись.

exec "$@"

или вы можете удалить точку входа из DockerFile и сделать как показано ниже.

для gunicorn команды контейнера в docker-compose.yml

command:
      [sh, -c, "python manage.py migrate && gunicorn main.wsgi:application --bind 0.0.0.0:8000 "]

Примечание : соберите статический файл заранее или вы можете добавить его в вышеуказанную команду

для celery команда контейнера в docker-compose.yml остается прежней.

Примечание: использование второго метода не является проблемой в данном случае. Но если у вас есть какая-то сложная проверка или задача, которую нужно выполнить перед раскруткой контейнера, используйте только сценарий Entrypoint

Вернуться на верх