Работник Dockerized Celery не выполняет задачи из очереди SQS Localstack - PullRequest
0 голосов
/ 14 февраля 2020

Я создаю 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

1 Ответ

0 голосов
/ 19 февраля 2020

Решил это, установив HOSTNAME и HOSTNAME_EXTERNAL в переменных окружения localstack. Изменяя их между localhost и localstack, я могу получить либо своих местных, либо docker работников из сельдерея, выполняющих задания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...