我在生产中重新构建并重新启动cookiecutter-django
docker-compose
时遇到此问题。我可以通过删除所有已停止的docker容器或在rm -f './celerybeat.pid'
中添加/compose/production/django/celery/beat/start.sh
类似于/compose/local/django/celery/beat/start.sh
来解决此问题。是否有任何理由不在compose文件的生产版本中包含此特定代码?
答案 0 :(得分:1)
之前有一篇有关如何通过在run命令中将PID文件设置为空值来解决此问题的文章,但解决方案尚未完成,花了我一点点的反复试验才能使其在我的生产中正常工作系统,所以我想发布一个 docker-compose 文件,该文件具有 beats 服务,该服务通过命令运行,以在创建新celerybeats.pid
文件时运行开始。
请注意,我使用的是 django-celery-beat :https://pypi.org/project/django-celery-beat/
version: '3'
services:
redis:
image: redis
restart: unless-stopped
ports:
- "6379"
beats:
build: .
user: user1
# note the --pidfile= in this command
command: celery --pidfile= -A YOURPROJECT beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
env_file: ./.env.prod
restart: unless-stopped
volumes:
- .:/code
- tmp:/tmp
links:
- redis
depends_on:
- redis
volumes:
tmp:
这样做,我不再遇到ERROR: Pidfile (celerybeat.pid) already exists
错误,也不必运行rm
命令。
答案 1 :(得分:0)
您可以使用celery worker --pidfile=/path/to/celeryd.pid
指定未安装的路径,以使其在主机上不成为镜像。
答案 2 :(得分:0)
以其他方式创建django命令celery_kill.py
import shlex
import subprocess
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **options):
kill_worker_cmd = 'pkill -9 celery'
subprocess.call(shlex.split(kill_worker_cmd))
docker-compose.yml:
celery:
build: ./src
restart: always
command: celery -A project worker -l info
volumes:
- ./src:/var/lib/celery/data/
depends_on:
- db
- redis
- app
celery-beat:
build: ./src
restart: always
command: celery -A project beat -l info --pidfile=/tmp/celeryd.pid
volumes:
- ./src:/var/lib/beat/data/
depends_on:
- db
- redis
- app
和Makefile:
run:
docker-compose up -d --force-recreate
docker-compose exec app python manage.py celery_kill
docker-compose restart
docker-compose exec app python manage.py migrate
答案 3 :(得分:0)
如果您可以不用beat
生活,芹菜可以通过传递'B'标志来处理周期性任务。执行此操作时,不会生成.pid文件,而是会生成celerybeat-schedule
文件。当您重新运行芹菜时,它不会抱怨重复使用此文件。就源代码控制而言,只需将其添加到您的.gitignore中即可。
以下是完整格式的命令:
celery -A <appname> worker -l info -BE
答案 4 :(得分:0)