Как разделить Docker-контейнеры Celery и Django

Я хотел бы отделить мой Docker-контейнер Celery от моего Docker-контейнера бэкенда (Django). Я бы хотел, чтобы контейнер Celery создавался без зависимости от контейнера бэкенда. В настоящее время все руководства, которые я нахожу в сети, настроены так, что образ Celery собирается с использованием контекста контейнера Backend следующим образом:

backend:
    build:
        context: ./backend
celery:
    build:
        context: ./backend

Мне кажется, что Celery, полагающийся на контекст backend для создания образа, не является правильным способом, поскольку в контейнере backend много ресурсов, не нужных из контекста celery.

В настоящее время мой проект docker-compose выглядит следующим образом:

backend:
    build:
        context: ./backend
celery:
    build:
        context: ./backend
        dockerfile: Dockerfile.celery

Дир дерева проекта:

├── backend
│   ├── Dockerfile
│   ├── Dockerfile.celery
│   ├── Dockerfile.prod
│   ├── entrypoint.dev.sh
│   ├── entrypoint.prod.sh
│   ├── requirements.txt
│   └── venv
├── docker-compose.ci.yml
├── docker-compose.prod.yml
├── docker-compose.yml
├── frontend
│   ├── Dockerfile
│   ├── Dockerfile.prod
├── nginx
│   ├── Dockerfile
│   ├── Dockerfile.prod
│   ├── certbot
│   └── conf

Dockerfile.celery:

FROM python:3.9.5-alpine

WORKDIR /backend

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add postgresql-dev \
    && pip install psycopg2 \
    && apk del build-deps 
    
RUN apk add gcc musl-dev python3-dev libffi-dev openssl-dev

RUN pip install --upgrade pip
COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt
COPY . /backend/
CMD ["celery -A backend worker -l info"]

Это вызывает ошибку:

Ответ ошибки от демона: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "celery -A backend worker -l info": executable file not found in $PATH: unknown

.

Итак, единственный способ, который я нашел, чтобы это работало, это если контекст сборки ./backend в контейнере celery, но это заставляет контейнер пытаться запустить другой бэкенд Django также в контейнере.

Хотелось бы иметь разделение между контейнером celery и контейнером backend, где есть celery/Dockerfile (dir/file) в основном проекте. Где docker-compose вызывает файл celery/Dockerfile для запуска celery отдельно.

Пример celery/Dockerfile:

FROM python:3.9.5-alpine
RUN pip install --upgrade pip
RUN pip install celery
CMD ["celery -A backend worker -l info"

Я понимаю, что celery вызывается в проекте Django backend (поэтому ему нужны эти процессы), так должен ли я просто запускать celery worker в backend Dockerfile (или скрипте entrypoint.sh)? Кажется, что они должны быть разделены.

Помощь приветствуется!

Edit: Я не спрашиваю мнения, а скорее, есть ли способ не полагаться на полный backend Dockerfile при запуске celery контейнера?

Вернуться на верх