我曾经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())
芹菜配置文件
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
使用接受的答案(仍然需要将代理和后端拆分为单独的队列),我设法通过以下更改使一切正常工作:
示例.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
芹菜配置文件
worker_prefetch_multiplier = 1
worker_concurrency =1
我认为问题在于您的客户端(尝试将某些任务发送到您的 Celery 集群的应用程序)使用的celeryconfig
模块与您在 Docker 中运行的 Celery worker使用的模块相同。
为什么这是个问题?- 因为 Docker 基础架构之外的所有内容都无法解析redis
。当然,如果您的客户端应用程序(生产者)在您上面粘贴的 docker-compose 脚本中指定的任何 docker 容器上运行,它将起作用,但是如果您尝试从主机运行某些示例,它将失败。
为了使其工作,您需要获取运行 redis 的容器的 IP,并使用使用该 IP 地址的修改后的 celeryconfig。
您甚至可以省略我上面提到的步骤,只需localhost:6379
在主机上的 broker 和 result_backend URL 中使用即可。我还建议您为这两个数据库使用不同的 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
结果后端。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句