首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dockerized Celery worker未从Localstack SQS队列中提取任务

Dockerized Celery worker未从Localstack SQS队列中提取任务
EN

Stack Overflow用户
提问于 2020-02-14 06:07:02
回答 1查看 1K关注 0票数 0

我正在使用芹菜构建一个用于后台任务的flask应用程序。我的应用程序使用在docker容器中运行的本地堆栈为我的消息代理在本地模拟SQS。我已经让flask和celery在本地运行,以便正确地使用localstack,我可以看到flask接收一个请求,向SQS队列添加一条消息,然后celery获得该任务并执行它。

我尝试将flask和celery与localstack一起停靠,我的所有服务都按预期运行,除了celery worker,它不执行队列中的任务。我可以在本地启动一个芹菜工人,它将读取队列并执行任务,但docker芹菜工人不会拉出任何任务。

在flask容器中运行celery worker会得到相同的结果,还会添加一些参数,比如我在这个github thread中找到的--without-gossip

我是不是在docker架构中遗漏了一些东西,使得芹菜不能从SQS队列中拉出?

这是我的docker-compose.yml:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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"]

entrypoint.sh:

代码语言:javascript
复制
source ../docker/bin/activate
gunicorn -c app/gunicorn_config.py --bind 0.0.0.0:5000 'app:create_app()'

celeryworker.sh

代码语言:javascript
复制
source ../docker/bin/activate
celery worker -A app.celery_worker.celery

celeryconfig.py

代码语言:javascript
复制
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-'}

我在本地使用相同的命令,一切都按预期运行。我还重新创建了本地虚拟环境,以确保requirements.txt中没有多余的包

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-19 05:30:25

通过在本地堆栈环境变量中设置HOSTNAMEHOSTNAME_EXTERNAL解决了此问题。通过在localhostlocalstack之间更改这两个值,我可以让本地或码头芹菜工人执行任务。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60217193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档