如何使用 Django 正确地对 Celery 进行 dockerize?

问题描述 投票:0回答:1

我在将 Celery 与 Django 项目一起进行 docker 化时遇到了一些问题。最近我需要将 Celery 添加到我的项目中,我之前已经使用过它,但不是在 Docker 环境中。

我正在寻找一种正确的方法来 dockerize 我的 Celery 工作线程,使其与我的配置一起工作。

这是我的 django dockerfile:

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、前端、postgres、redis 等...

我尝试输入基本的 Celery 启动命令:

celery -A proj worker --loglevel=INFO
在我的入口点脚本中尝试让它以这种方式运行,但很快意识到,当然,除非所有内容都已迁移,否则工作程序不会启动,但我也无法弄清楚如何自动迁移,因为我无法通过入口点脚本连接到数据库,另外我听说自动迁移是一个坏主意,应该在所有容器启动后手动完成。

即使考虑到我已经做到了这一点,这也可能不是理想的解决方案,因为该命令应该仅用于开发(我认为?),并且应该为生产环境启动适当的系统服务。

我正在寻求所有可以获得的帮助,谢谢!

django docker celery django-celery
1个回答
0
投票

我只是为自己的项目设置了这个,这样我就可以理解您所面临的困难,就像我面临同样的困难一样。这就是我的设置方式:

  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 文件中设置命令,您将覆盖 Dockerfile 中设置的

CMD
。这样你就不必改变你的
entrypoint.sh

© www.soinside.com 2019 - 2024. All rights reserved.