Как разделить 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
контейнера?