【问题标题】:Error 99 connecting to localhost:6379. Cannot assign requested address. when running app connected to redis连接到 localhost:6379 时出现错误 99。无法分配请求的地址。运行连接到redis的应用程序时
【发布时间】:2021-12-17 01:50:48
【问题描述】:

我正在 docker 容器内构建这个 python 应用程序,但无法访问其中的 Redis 端口。

在我的Dockerfile 中,我添加了一行:

EXPOSE 6379

但运行应用程序会引发错误redis.exceptions.ConnectionError: Error 99 connecting to localhost:6379. Cannot assign requested address.

不得不提的是,我的应用只从 redis 队列中弹出项目。

编辑: 我的Dockerfile 看起来像这样:

FROM python:3.9

ARG DATABASE
ARG SSL_TOKEN_PATH

ENV DATABASE=$DATABASE
ENV SSL_TOKEN_PATH=$SSL_TOKEN_PATH

COPY config/db_config.yaml db_config.yaml
COPY app/requirements.txt requirements.txt

ENV DB_CONFIG=config/db_config.yaml

COPY app/pydb/requirements.txt pydb/requirements.txt

RUN pip3 install -r requirements.txt
RUN pip3 install -r pydb/requirements.txt

COPY app/ .

EXPOSE 6379

CMD ["python3", "-u", "process_file.py"]

【问题讨论】:

  • 您使用了多少张图片?一个用于 python 应用程序,一个用于 redis?在 python 容器中,您需要使用 redis 容器 dns,而不是 localhost。由于容器内的 localhost 指向容器本身,redis 不应该在那里运行,而是在另一个容器中运行。
  • 我只使用了一张图片——python 应用图片。所以我应该有两个单独的容器?一个用redis,一个用python app?
  • 容器的理念是为应用程序的每个组件使用一个容器。这是一个用于您的 python 应用程序,另一个用于 redis 服务器。从您的问题和评论来看,您到底在做什么还不是很清楚。请您提供完整的Dockerfile
  • 既然我只想从 redis 队列中弹出项目,我真的需要将 redis 放在一个单独的容器中吗?总而言之,我有一个应用程序可以处理从 redis 队列中弹出的文件。我在编辑中提供了整个Dockerfile
  • 除非process_file.py正在启动一个redis实例,否则没有redis服务器启动或监听连接。

标签: python redis


【解决方案1】:

解决这个问题的方法是使用以下方法在 docker 中创建一个网络:

docker network create <name_of_network>

作为hostredis 内,您必须提供:host.docker.internal

最后在创建的网络中运行容器:

docker run --network <name_of_network> -d <image_name>

这解决了问题,我不必仅为redis 创建新容器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多