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