Как правильно докеризировать 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

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