gpt4 book ai didi

docker - 使用 Docker 时将 Celery 连接到 Redis 时出错

转载 作者:可可西里 更新时间:2023-11-01 11:14:12 30 4
gpt4 key购买 nike

我已经使用 docker-compose 创建了一个包含 redis 和 celery 的 docker 实例。这将成功构建,但是,在我的 python 脚本中,当我尝试向我的队列中添加一些内容时,出现以下错误:

Error 8 connecting to redis:6379. nodename nor servname provided, or not known.

我已经尝试更改我的 celeryconfig 文件地址,并尝试了这里建议的解决方案:https://github.com/mozilla-services/cliquet/issues/664但我无法修复它。

有没有其他人遇到过这样的问题?

** example.py 的一部分 **

app = Celery('server', broker='redis://redis:6379/0')
app.config_from_object(celeryconfig)

@app.task(trail=True)
def count_words_at_url(url):
time.sleep(50)
resp = requests.get(url)
return len(resp.text.split())

celeryconfig.py

result_backend = 'redis://redis:6379/0'
broker_url = 'redis://redis:6379/0'
worker_prefetch_multiplier = 1
worker_concurrency =1

Dockerfile.celery

FROM python:3.6-alpine
WORKDIR /usr/src/app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ulimit -n 1024
CMD celery -A celeryExample worker --concurrency=1 --loglevel=info

docker-compose.yml

version: '3'

services:
redis:
image: redis
ports:
- 6379:6379
celery:
build:
context: .
dockerfile: Dockerfile.celery
links:
- redis:redis
depends_on:
- redis
volumes:
- .:/usr/src/app

有了公认的答案(仍然需要将代理和后端拆分为单独的队列),我已经设法让一切正常工作,并进行了以下更改:

example.py:

broker_url = os.environ.get('broker_url', 'redis://localhost:6379'),
result_backend = os.environ.get('result_backend', 'redis://localhost:6379')

app = Celery('server', broker = broker_url,
backend = result_backend)
app.config_from_object(celeryconfig)

@app.task(trail=True)
def count_words_at_url(url):
time.sleep(50)
resp = requests.get(url)
return len(resp.text.split())

Dockerfile.celery

FROM python:3.6-alpine
ENV CELERY_BROKER_URL redis://redis:6379/0
ENV CELERY_RESULT_BACKEND redis://redis:6379/0
ENV C_FORCE_ROOT true
WORKDIR /usr/src/app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD celery -A celeryExample worker --concurrency=1 --loglevel=info

celeryconfig.py

worker_prefetch_multiplier = 1
worker_concurrency =1

最佳答案

我认为问题在于您的客户端(尝试向您的 Celery 集群发送某些任务的应用程序)使用的是与在 Docker 中运行的 Celery worker 使用的相同的 celeryconfig 模块。

为什么这是个问题? - 因为 Docker 基础架构之外的所有内容都无法解析 redis 。当然,如果您的客户端应用程序(生产者)在您在上面粘贴的 docker-compose 脚本中指定的任何 docker 容器上运行,它会工作,但是如果您尝试从主机运行某些东西,例如,它将失败。

为了让它工作,您需要获取运行 redis 的容器的 IP,并使用使用此 IP 地址的修改后的 celeryconfig。

您甚至可以省略我上面提到的步骤,只需在主机上的 broker 和 result_backend URL 中使用 localhost:6379 即可。我还建议您为这两个使用不同的 Redis 数据库(假设您将 6 用于代理,将 8 用于 result_backend)。

在您的example.py 中,如果您将 redis://redis:6379/0 替换为 redis://localhost:6379/0,它应该可以工作。

总结一下:

  • 在您的 Docker 基础架构中运行的所有 Celery worker 都应该有 celeryconfig,其中 redis://redis:6379/1(例如)作为代理 URL,redis://redis:6379/3 作为结果后端 URL。

    <
  • 在您的 Docker 基础架构之外运行的每个生产者(例如,您可能希望在主机上运行的脚本)都应该有不同的 celeryconfig,它将 Celery 应用程序配置为使用 redis://localhost:6379/1作为代理,redis://localhost:6379/3 作为结果后端。

关于docker - 使用 Docker 时将 Celery 连接到 Redis 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57461129/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com