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

安德鲁

我曾经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用于代理和8result_backend)。

在你example.py,如果更换redis://redis:6379/0redis://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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用github动作+ mysql + python连接到mysql时出错

使用docker compose文件尝试连接Redis时连接被拒绝

Celery:连接到RabbitMQ服务器时出错

rails + docker + sidekiq +在127.0.0.1:6379(Errno :: ECONNREFUSED)上连接到Redis时出错

GiLab CI-Redis :: CannotConnectError:在127.0.0.1:6379上连接到Redis时出错

使用Flask将Docker容器连接到App Engine中的PostgreSQL时出现问题

如何配置docker以将Redis与celery一起使用

使用JGit连接到GitLab时出错

使用VPC使用Lambda连接到Oracle时出错

连接到Vault Docker时检查密封状态时出错

使用Node.js连接到Mlab时出错

使用Mongolite连接到MongoDB时出错

将Resque-Scheduler与Docker-Compose结合使用-在本地主机上连接到Redis时出错:6379

使用密码从pyspark连接到mongodb时出错

在Docker容器中连接到SQL Server时出错

尝试使用docker-compose通过节点连接到Redis时ECONNREFUSED

使用Node JS连接到Atlas MongoDB时出错

使用docker时Go无法连接到Mongo容器

将solr连接到mysql时出错

使用python连接到Cloudsql时出错

使用'pip install celery'在ubuntu上安装celery时出错

使用IDE连接到Openshift服务器时出错

使用Capistrano通过SSH连接到Bitbucket时出错

使用 sqlalchemy 连接到 postgresql 时出错

Docker:使用 docker run 而不是 docker-compose up 时无法连接到 Redis

使用 docker 时连接到 mongodb

连接到 Angular docker 容器时出错

连接到redis docker容器时出错

无法从池中获取资源 - 使用 Java 连接 redis docker 容器时出错