And*_*rew 1 redis celery docker docker-compose
我曾经docker-compose创建过一个包含 redis 和 celery 的 docker 实例。这将成功构建,但是,在我的 python 脚本中,当我尝试将某些内容添加到队列中时,出现以下错误:
Error 8 connecting to redis:6379. nodename nor servname provided, or not known.
Run Code Online (Sandbox Code Playgroud)
我尝试更改我的 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())
Run Code Online (Sandbox Code Playgroud)
celeryconfig.py
result_backend = 'redis://redis:6379/0'
broker_url = 'redis://redis:6379/0'
worker_prefetch_multiplier = 1
worker_concurrency =1
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
通过接受的答案(仍然需要将代理和后端拆分到单独的队列),我已经设法让一切正常工作,并进行以下更改:
示例.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())
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
celeryconfig.py
worker_prefetch_multiplier = 1
worker_concurrency =1
Run Code Online (Sandbox Code Playgroud)
我相信问题在于您的客户端(尝试将某些任务发送到 Celery 集群的应用程序)正在使用与celeryconfigDocker 内运行的 Celery 工作线程相同的模块。
为什么这是个问题?- 因为 Docker 基础设施之外的所有内容都无法解析redis。当然,如果您的客户端应用程序(生产者)在您上面粘贴的 docker-compose 脚本中指定的任何 docker 容器上运行,它就会工作,但如果您尝试从主机运行某些内容(例如),它将失败。
为了使其工作,您需要获取运行redis的容器的IP,并使用修改后的celeryconfig来使用该IP地址。
您甚至可以省略我上面提到的步骤,只需localhost:6379在主机上的broker 和result_backend URL 中使用即可。我还建议您为这两个数据库使用不同的 Redis 数据库(假设您用于6代理和8result_backend)。
在您的example.py中,如果您替换redis://redis:6379/0为redis://localhost:6379/0它应该可以工作。
总结一下:
在 Docker 基础设施中运行的所有 Celery 工作线程都应该具有 celeryconfig,该配置具有redis://redis:6379/1(例如)代理 URL 和redis://redis:6379/3结果后端 URL。
在 Docker 基础设施之外运行的每个生产者(例如,您可能想要在主机上运行的脚本)都应该有不同的 celeryconfig,它将 Celery 应用程序配置为用作redis://localhost:6379/1代理和redis://localhost:6379/3结果后端。
| 归档时间: |
|
| 查看次数: |
3227 次 |
| 最近记录: |