Я создаю flask приложение с сельдереем для фоновых задач. Мое приложение использует localstack, работающий в контейнере docker, для локального имитации c SQS для моего брокера сообщений. Я получил flask и сельдерей, работающий локально для корректной работы с локальным стеком, где я вижу, как flask получает запрос, добавляет сообщение в очередь SQS, а затем сельдерей берет эту задачу и выполняет ее.
Я попытался докеризировать flask и сельдерей вместе с локальным стеком, и все мои службы работают как положено, за исключением работника сельдерея, который не выполняет задачи из очереди. Я могу запустить работника сельдерея локально, который будет читать очередь и выполнять задачи, но docker работник сельдерея не будет выполнять никаких задач.
Запуск работника сельдерея в контейнере flask достиг таких же результатов, как и добавление аргументов типа --without-gossip
, которые я нашел в этом потоке github .
Я что-то упускаю в архитектуре docker, из-за которой сельдерей не извлекается из очереди SQS?
Вот мой docker -compose.yml:
services:
dev:
build:
context: .
dockerfile: 'dev.Dockerfile'
ports:
- "5050:5000"
restart: always
volumes:
- .:/app
environment:
- GUNICORN_CMD_ARGS="--reload"
- docker_env=true
stdin_open: true
tty: true
command: ./entrypoint.sh
depends_on:
- localstack
# mimics AWS services locally
localstack:
image: localstack/localstack:latest
ports:
- '4561-4599:4561-4599'
- '8080:8080'
environment:
- SERVICES=sqs
- DEBUG=1
- DATA_DIR=/tmp/localstack/data
volumes:
- './.localstack:/tmp/localstack'
restart: always
celery:
build:
context: .
dockerfile: 'dev.Dockerfile'
volumes:
- .:/app
environment:
- docker_env=true
stdin_open: true
tty: true
command: ./celeryworker.sh
restart: always
links:
- localstack
depends_on:
- localstack
volumes:
.:
dev.dockerfile:
FROM python:3.6
USER root
# Environment Variables
ENV HOST 0.0.0.0
ENV PORT 5000
# Install Packages
COPY requirements.txt /requirements.txt
RUN /bin/bash -c "python3 -m venv docker \
&& source docker/bin/activate \
&& pip3 install --upgrade pip \
&& pip3 install -r requirements.txt"
# Source Code
WORKDIR /app
COPY . .
COPY app/gunicorn_config.py /deploy/app/gunicorn_config.py
COPY entrypoint.sh /bin/entrypoint.sh
COPY celeryworker.sh /bin/celeryworker.sh
USER nobody
EXPOSE 5000
CMD ["bash"]
точка входа. sh:
source ../docker/bin/activate
gunicorn -c app/gunicorn_config.py --bind 0.0.0.0:5000 'app:create_app()'
сельдерея. sh
source ../docker/bin/activate
celery worker -A app.celery_worker.celery
celeryconfig.py
import os
BROKER_URL = 'sqs://fake:fake@localhost:4576/0' # local sqs
# BROKER_URL = 'redis://localhost:6379/0' # local redis
# RESULT_BACKEND = 'redis://localhost:6379/0' # local redis
if os.getenv('docker_env', 'local') != 'local':
BROKER_URL = 'sqs://fake:fake@localstack:4576/0'
BROKER_TRANSPORT_OPTIONS = {'queue_name_prefix': 'app-'}
I используйте те же самые команды локально, и все будет работать как положено. Я также воссоздал свою локальную виртуальную среду, чтобы убедиться, что у меня нет дополнительных пакетов, которых нет в моем requirements.txt