Django + Celery + Nginx

Я пытаюсь запустить мое приложение django в docker с Celery и Nginx.

Docker-compose

version: '3'

services:
  helpdesk_web:
    build:
      context: ./
      dockerfile: Dockerfile
    container_name: helpdesk_web
    volumes:
      - ./static:/usr/src/app/static
      - media:/usr/src/app/media
    ports:
      - "8000:8000"
      - "5678:5678"
    env_file:
      - ./.env
    restart: always
    depends_on:
      - helpdesk_db
      - helpdesk_redis

  helpdesk_db:
    image: postgres
    container_name: helpdesk_db
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file:
      - ./.env
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: helpdesk_db
      POSTGRES_PASSWORD: itds
      POSTGRES_USER: itds

  nginx:
    build:
      context: ./docker/nginx
      dockerfile: Dockerfile
    container_name: helpdesk_nginx
    restart: on-failure
    depends_on:
      - helpdesk_web
      - helpdesk_db
    ports:
      - "80:80"
    volumes:
      - ./static:/usr/src/app/static
      - media:/usr/src/app/media
  
  helpdesk_redis:
    image: redis
    ports: 
      - "6379:6379"
  
  helpdesk_celery:
    build: 
      context: .
      dockerfile: Dockerfile
    command: celery -A helpdesk worker -l INFO --pool=solo
    depends_on:
      - helpdesk_web
      - helpdesk_redis
  
  helpdesk_celery-beat:
    build: 
      context: .
      dockerfile: Dockerfile
    command: celery -A helpdesk beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
    depends_on:
      - helpdesk_web
      - helpdesk_redis

volumes:
  postgres_data:
  media:

Dockerfile

FROM python:3.10


WORKDIR /usr/src/app


ENV PYTHONDONTWRITEBYTECODE 1

ENV PYTHONUNBUFFERED 1

RUN pip install --upgrade pip


COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . .

RUN chmod +x entrypoint.sh

ENTRYPOINT ["/usr/src/app/entrypoint.sh"]

entrypoint.sh

#! /bin/sh
if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."
    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done
    echo "PostgreSQL started"
fi
python manage.py migrate --no-input
exec gunicorn helpdesk.wsgi:application -b 0.0.0.0:8000 --workers=$WORKERS_COUNT

Когда я запускаю docker-compose, я получаю эту ошибку enter image description here

У меня есть dev docker-compose без nginx, и он работает нормально. Кажется, что есть некоторые проблемы между celery и nginx. Я новичок в docker, поэтому не знаю, что делать.

Что я упускаю?

Compose command: перекрывает Dockerfile CMD и передается в качестве аргументов для ENTRYPOINT. Типичная установка заключается в том, чтобы ваш скрипт начальной точки выполнял первую настройку, например, ожидание базы данных, а затем завершался специальной командой оболочки exec "$@" для выполнения команды, переданной ему в качестве аргументов.

#!/bin/sh
# Wait for the database, run migrations, set environment variables, ...
if [ "$DATABASE" = "postgres" ]; then ...; fi
python manage.py migrate --no-input

# Run the command passed as arguments, not a fixed command here
exec "$@"

В вашем Dockerfile объявите по умолчанию CMD вы хотите, чтобы контейнер запускался, например GUnicorn.

ENTRYPOINT ["/usr/src/app/entrypoint.sh"]
CMD gunicorn helpdesk.wsgi:application -b 0.0.0.0:8000 --workers=$WORKERS_COUNT

Теперь он будет выполнять команду Compose command:, или другую команду, которую вы docker-compose run.

version: '3.8'
services:
  web:
    build: .
    ports: ['8000:8000', '5678:5678']
    env_file: [.env]
    restart: always
    depends_on: [db, redis]
    # and the default image CMD
  celery:
    build: .
    command: celery -A helpdesk worker -l INFO --pool=solo
    depends_on: [redis]
  celery-beat:
    build: .
    command: celery -A helpdesk beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
    depends_on: [redis]
  db: { ... }
  redis: { image: redis }
Вернуться на верх