我在将 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
在我的入口点脚本中尝试让它以这种方式运行,但很快意识到,当然,除非所有内容都已迁移,否则工作程序不会启动,但我也无法弄清楚如何自动迁移,因为我无法通过入口点脚本连接到数据库,另外我听说自动迁移是一个坏主意,应该在所有容器启动后手动完成。
即使考虑到我已经做到了这一点,这也可能不是理想的解决方案,因为该命令应该仅用于开发(我认为?),并且应该为生产环境启动适当的系统服务。
我正在寻求所有可以获得的帮助,谢谢!
我只是为自己的项目设置了这个,这样我就可以理解您所面临的困难,就像我面临同样的困难一样。这就是我的设置方式:
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