Выпуск Dockerising Django + Celery ... Невозможно загрузить приложение из сельдерея - PullRequest
0 голосов
/ 23 января 2020

У меня небольшая проблема с раскруткой стека Dockerised: Django, Redis, Celery на магистральной линии сервера nginx и gunicorn. Приложение Django подключается к внешней базе данных PostgreSQL.

У меня есть следующий файл docker-compose.yaml:

version: '3.7'

services:
  web:
    build:
      context: ./django
      dockerfile: Dockerfile
    expose:
      - "8000"
    volumes:

      - django-static:/usr/src/app/static
      - django-uploads:/usr/src/app/uploads
    depends_on:
      - redis
    links:
      - redis:redis
    environment:
      ...

    command: /usr/src/app/wave.sh

  nginx:
    build:
      context: nginx
      dockerfile: Dockerfile
    restart: on-failure
    ports:
      - 80:80
      - 443:443
    volumes:
      - ssl_data:/etc/resty-auto-ssl
    environment:
      ALLOWED_DOMAINS: "${STAGING_ALLOWED_DOMAINS}"
      SITES: "${STAGING_SITES}"

  redis:
    restart: always
    image: redis:latest
    ports:
      - '6379:6379'

  celery:
    build: ./django
    command: celery --app=Wave.celery.app worker --loglevel=DEBUG

    environment:
      ...

    volumes:
      - './django:/usr/src/app/'
    links:
      - redis:redis
    depends_on:
      - web
      - redis
      - nginx
    restart: on-failure

  celery-beat:
    build: ./django
    command: celery --app=Wave.celery.app beat --loglevel=DEBUG

    environment:
      ...

    volumes:
      - './django:/usr/src/app/'
    links:
      - redis:redis
    depends_on:
      - web
      - redis
      - nginx
    restart: on-failure

volumes:
  ssl_data:
  django-static:
  django-uploads:

Однако при использовании:

docker-compose -f docker-compose.wave-api-staging.yml up --build --force-recreate

Сценарий wave.sh выглядит следующим образом:

#!/bin/sh
rm -rf celerybeat.pid

ln -s /run/shm /dev/shm

python3 manage.py collectstatic --no-input
python3 manage.py migrate
python3 manage.py shell < createsuperuser.py

pip3 freeze

/usr/local/bin/gunicorn Wave.wsgi:application --timeout 3600 --log-level=DEBUG -w 5 -b :8000

, который заменяет следующую инструкцию command в службе web:

command: bash -c "rm -rf celerybeat.pid && python3 manage.py makemigrations && python3 manage.py migrate --run-syncdb && python3 manage.py shell < createsuperuser.py && python3 manage.py runserver 0.0.0.0:8000"

celery.py:

import os

import datetime

from celery import Celery
from celery.schedules import crontab

from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Wave.settings')

app = Celery('Wave', include=['amq.v1.SurfTaskRunner.demand', 'amq.v1.SurfTaskRunner.periodic'])

app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    sender.add_periodic_task(
        crontab(minute='6,16,26,36,46,56', hour='*', day_of_week='*', day_of_month='*'),
        dispatch_surfers_waivers_periodic_task.s(),
    )

@app.task(bind=True)
def dispatch_surfers_waivers_periodic_task(self):

Dockerfile:

FROM python:3.7.2-slim

RUN apt-get update && apt-get -y install cron && apt-get -y install nano

ENV PYTHONUNBUFFERED 1

RUN mkdir /usr/src/app

WORKDIR /usr/src/app

COPY ./requirements.txt /usr/src/app/requirements.txt

RUN pip install -r requirements.txt

COPY ./wave.sh /usr/src/app/wave.sh

RUN ["chmod", "+x", "/usr/src/app/wave.sh"]

COPY . /usr/src/app

Я получаю следующие ошибки от служб сельдерея и ритма сельдерея:

celery_1       | Error: 
celery_1       | Unable to load celery application.
celery_1       | The module Wave was not found.
celery-beat_1  | Error: 
celery-beat_1  | Unable to load celery application.
celery-beat_1  | The module Wave was not found.

Я много пробовал читать и гуглить, но до сих пор не нашел никаких подсказок относительно того, что здесь может пойти не так ... Я на грани полного отказа от сельдерея, если я не могу заставить это работать?

Однако тот же процесс можно запустить локально без nginx и с помощью стандартной команды python manage.py runserver.


Обновление: вот моя локальная разработка docker -compose.yml файл:

version: '3.7'

services:
  django:
    build:
      context: ./django
      dockerfile: Dockerfile
    ports:
      - 8982:8982
    depends_on:
      - postgres
      - redis
    links:
      - postgres:postgres
      - redis:redis
    command: bash -c "rm -rf celerybeat.pid && python3 manage.py makemigrations && python3 manage.py migrate --run-syncdb && python3 manage.py shell < createsuperuser.py && python3 manage.py runserver 0.0.0.0:8982"
    volumes: ['./django:/usr/src/app/']
    environment:
        ...

  redis:
    restart: always
    image: redis:latest
    ports:
      - '6379:6379'

  celery:
    build: ./django
    command: celery -A Wave worker --loglevel=DEBUG

    environment:
        ...

    volumes:
      - './django:/usr/src/app/'
    links:
      - postgres:postgres
      - redis:redis
    depends_on:
      - django
      - postgres
      - redis
    restart: on-failure

  celery-beat:
    build: ./django
    command: celery -A Wave beat --loglevel=DEBUG

    environment:
        ...

    volumes:
      - './django:/usr/src/app/'
    links:
      - postgres:postgres
      - redis:redis
    depends_on:
      - django
      - postgres
      - redis
    restart: on-failure

  postgres:
    build:
      context: ./postgres
      dockerfile: Dockerfile
    ports:
      - 5433:5432
    expose:
      - 5432
    environment:
      - POSTGRES_DB=conveyor
      - POSTGRES_USER=conveyor
      - POSTGRES_PASSWORD=89$r55cP%fSDDghypoAsdd
...