Как правильно докеризировать Celery с Django?
У меня возникла небольшая проблема с докеризацией Celery вместе с моим проектом Django. Недавно у меня возникла необходимость добавить Celery в мои проекты, и я уже работал с ним ранее, но не в среде Docker.
Я ищу подходящий способ докеризации моего Celery worker, который будет работать вместе с моей конфигурацией.
Вот мой докерфайл django:
FROM python:3.9.13-slim
CMD ["mkdir", "app/backend/"]
WORKDIR /app/backend/
COPY ./backend/ .
ENV PYTHONUNBUFFERED 1
RUN pip install --upgrade pip && \
pip install -r requirements.txt && \
python manage.py collectstatic --noinput && \
chmod +x scripts/entrypoint.sh
CMD ["scripts/entrypoint.sh"]
Вот мой скрипт точки входа (все, что он делает, это запускает сервер gunicorn):
#!/bin/bash
APP_PORT=${PORT:-8000}
gunicorn project.wsgi:application --reload --bind "0.0.0.0:${APP_PORT}"
Это мой docker-compose:
version: '3.8'
services:
backend:
container_name: project-backend
build:
context: .
dockerfile: docker/backend/Dockerfile
volumes:
- static:/app/backend/static
ports:
- "8000:8000"
depends_on:
- database
redis:
container_name: project-redis
image: redis:alpine
database:
image: postgres:15
container_name: project-postgres
volumes:
- postgres_data:/var/lib/postgresql/data
env_file:
- ./backend/project/.env
ports:
- "8001:5432"
frontend-nginx:
container_name: project-frontend-nginx
build:
context: .
dockerfile: docker/frontend-nginx/Dockerfile
volumes:
- node_modules:/app/frontend/node_modules
- static:/app/backend/static
ports:
- "80:80"
depends_on:
- backend
- database
volumes:
static:
postgres_data:
node_modules:
Не обращайте внимания на другие сервисы в docker-compose, это все остальное, что необходимо для работы моего проекта, запуск nginx, frontend, postgres, redis и т.д...
Я попытался вставить базовую команду запуска Celery:
celery -A proj worker --loglevel=INFO
в моем скрипте точки входа, чтобы попытаться запустить его таким образом, но быстро понял, что, конечно, рабочий не запустится, пока все не будет мигрировано, но я также не смог понять, как автоматически мигрировать, поскольку я не могу получить соединение с базой данных через скрипты точки входа, и, кроме того, я слышал, что это плохая идея автоматически мигрировать и что это должно быть сделано вручную после того, как все контейнеры будут подняты.
Даже если учесть, что у меня это работает, это также, вероятно, не будет идеальным решением, поскольку эта команда должна быть только для разработки (я думаю?), а для производственных сред должна быть запущена соответствующая системная служба.
Мне нужна любая помощь, которую я могу получить, спасибо!
Я только что установил это для своего собственного проекта, поэтому я могу понять, с какими трудностями вы столкнулись, поскольку я столкнулся с теми же трудностями. Вот как у меня это настроено:
celery:
image: same docker image as your regular application
command: celery -A your_project worker -l info
volumes:
- static_volume:/home/app/web/staticfiles
- media_volume:/home/app/web/mediafiles
depends_on:
- backend
- redis
environment:
- DB_NAME=xxx
- DB_USER=xxx
- DB_PASSWORD=xxx
- CELERY_BROKER_URL=redis://redis:6379/0
- CELERY_RESULT_BACKEND=redis://redis:6379/0
Задавая команду в файле docker compose, вы перезаписываете CMD
, заданную в вашем Dockerfile. Таким образом, вам не придется менять entrypoint.sh