首页 > 解决方案 > 在 Docker 容器中使用 Redis 的 Flask 应用程序在 Azure 部署中失败(在本地工作):连接到 redis:6379 时出现错误 -2。名称或服务未知

问题描述

在 Azure 上部署 Flask 应用程序时遇到问题。该应用程序是一个简单的 Flask 应用程序,它使用 Celery 作为任务队列,使用 Redis 作为消息代理。当我调用docker-compose up --build. 将应用程序部署到 Azure 时,我似乎无法弄清楚我做错了什么。

该应用程序似乎可以正常部署,除非我尝试执行异步任务 - 它挂起并在浏览器中给出意外的错误响应。

这是我的 docker-compose.yml 文件:

version: '2'

services:
  redis:
    image: 'redis:3.0-alpine'
    command: redis-server
    volumes:
      - 'redis:/var/lib/redis/data'
    ports:
      - '6379:6379'

  website:
      - celery
    build: .
    command: >
      gunicorn -b 0.0.0.0:5000
        --access-logfile -
        --reload
        "flask_app.app:create_app()"
    environment:
      PYTHONUNBUFFERED: 'true'
    volumes:
      - '.:/flask_app'
    ports:
      - '5000:5000'

  celery:
    restart: always
    build: .
    command: celery worker -l info -A flask_app.tasks
    env_file:
      - '.env'
    volumes:
      - '.:/flask_app'

volumes:
  redis:

这是我的 Dockerfile:

FROM python:3.7.5-slim-buster

ENV INSTALL_PATH /flask_app
RUN mkdir -p $INSTALL_PATH

WORKDIR $INSTALL_PATH

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000 6379
CMD gunicorn -b 0.0.0.0:5000 --access-logfile - "flask_app.app:create_app()"

以下是错误日志的片段:

ERROR] Error handling request /longtask
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/redis/connection.py", line 559, in connect
  sock = self._connect()
File "/usr/local/lib/python3.7/site-packages/redis/connection.py", line 585, in _connect
  socket.SOCK_STREAM):
File "/usr/local/lib/python3.7/socket.py", line 748, in getaddrinfo
  for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/celery/backends/redis.py", line 127, in reconnect_on_error
  yield
File "/usr/local/lib/python3.7/site-packages/celery/backends/redis.py", line 177, in _consume_from
  self._pubsub.subscribe(key)
File "/usr/local/lib/python3.7/site-packages/redis/client.py", line 3580, in subscribe
  ret_val = self.execute_command('SUBSCRIBE', *iterkeys(new_channels))
File "/usr/local/lib/python3.7/site-packages/redis/client.py", line 3468, in execute_command
  self.shard_hint
File "/usr/local/lib/python3.7/site-packages/redis/connection.py", line 1192, in get_connection
  connection.connect()
File "/usr/local/lib/python3.7/site-packages/redis/connection.py", line 563, in connect
  raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error -2 connecting to redis:6379. Name or service not known.

我试过的:

看起来应用程序无法发现 redis 服务,或者在 Azure 上没有正确启动(使用 Docker Compose Preview)。我是 Web 开发、Azure 和 Stack Overflow 的新手。我不太确定如何在 Azure 上解决此问题,希望能提供任何帮助。

谢谢。

标签: azuredockerflaskredisdocker-compose

解决方案


推荐阅读