azure - 在 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.
我试过的:
- 在我的存储库中包含一个
.gitattributes
文件以确保 shell 脚本使用 LF 作为行尾。 - 按照这篇文章的建议,在 docker-compose 文件中包含一个网络:错误:无法在 redis:6379 连接到 Redis:名称或服务未知
- 按照 StackOverflow 其他地方的建议,将 'depends_on: -celery -redis' 添加到 docker-compose 文件中。 如何使用 Docker-Compose 将多个 MEAN 应用程序容器部署到 Azure
看起来应用程序无法发现 redis 服务,或者在 Azure 上没有正确启动(使用 Docker Compose Preview)。我是 Web 开发、Azure 和 Stack Overflow 的新手。我不太确定如何在 Azure 上解决此问题,希望能提供任何帮助。
谢谢。
解决方案
推荐阅读
- python - 如何在 pandas 中向 .str.contains 添加多个字符串?
- python - 自底向上通信 Python
- sql-server - 使用加密时插入空白值
- java - 在 Eclipse 中导出可运行的 jar 文件时出现问题
- powershell - Powershell 更新 AD 代理地址
- tableau-api - 在 Tableau 中截断日期筛选器
- django - NoReverseMatch 在 /sessions/exercise/6/update/
- apdu - APDU 命令帮助 80 72
- amazon-web-services - 在 cloudformation cfn-init 中使用 linux 环境变量
- variables - Power BI DAX:使用 if 语句根据没有值的日期计算变量