Django celery не может импортировать имя 'Celery' из 'celery' после перезапуска Docker
Я запускаю Django и Celery в Docker. Все работает нормально, но после перезапуска Docker, Celery не может запуститься из-за ошибки имени импорта
Ошибки ниже:
Вот структура моего проекта:
notifications
notification
__init__.py
celery.py
Вот мой файл init.py:
from .celery import app as celery_app
__all__ = ("celery_app",)
Вот мой celery.py:
import os
from celery import Celery
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "notification.settings")
app = Celery("notification")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
Вот мой файл docker:
version: "3.9"
services:
redis:
container_name: v_redis
image: redis:alpine
restart: always
db:
container_name: v_db
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
env_file:
- ./production.env
restart: always
web:
container_name: v_web
build: .
command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py collectstatic --no-input && gunicorn notification.wsgi:application --limit-request-line 0 --workers=4 --threads=4 --worker-class=gthread --bind 0.0.0.0:8000"
env_file:
- ./production.env
volumes:
- .:/app
- ./staticfiles:/staticfiles
expose:
- 8000
depends_on:
- db
- redis
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/"]
interval: 30s
timeout: 10s
retries: 5
celery:
container_name: v_celery
build: .
command: celery -A notification worker -l info --concurrency 4
env_file:
- ./production.env
# volumes:
# - ./redis/:/usr/src/app/
depends_on:
web:
condition: service_healthy
redis:
condition: service_started
restart: always
celery-beat:
container_name: v_celery_beat
build: .
command: celery -A notification beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
env_file:
- ./production.env
# volumes:
# - ./redis/:/usr/src/app/
depends_on:
- redis
restart: always
flower:
container_name: v_celery_flower
image: mher/flower
command: celery flower
environment:
- CELERY_BROKER_URL=redis://redis:6379/0
- FLOWER_PORT=5555
ports:
- 5555:5555
depends_on:
- redis
restart: always
nginx:
container_name: v_nginx
build: ./nginx
volumes:
- ./staticfiles:/staticfiles
# - ./nginx/nginx.conf:/etc/nginx/nginx.conf
ports:
- 80:80
- 443:443
depends_on:
- web
restart: always
Мой Dockerfile:
# syntax=docker/dockerfile:1
FROM python:3.7
WORKDIR /app
COPY . /app/
RUN pip install -r requirements.txt
Мои требования.txt:
Django>=3.0,<4.0
gunicorn==20.1.0
psycopg2-binary>=2.8
django-crispy-forms
django-celery-beat
django-select2
django-redis
slack_sdk
PyMuPDF
Pillow
google-api-python-client
google-auth-oauthlib
oauth2client
pandas
celery==5.1.2
redis==3.5.3
sqlalchemy
sshtunnel
matplotlib
boto3
Я не знаю, почему он не работает после перезапуска Docker. Пожалуйста, помогите. Спасибо.
это ошибка bug, которая возникает только в python 3.7
(той же версии, которую вы используете), потому что последняя версия importlib-metadata
.
просто понизить importlib-metadata<5.0
: pip install importlib-metadata==4.13.0