Почему происходит тайм-аут соединения с Redis, когда fastapi и aioredis развертываются вместе в контейнере докеров?Python

Программы на Python
Ответить
Anonymous
 Почему происходит тайм-аут соединения с Redis, когда fastapi и aioredis развертываются вместе в контейнере докеров?

Сообщение Anonymous »

На моем сервере Redis развернут в контейнерной форме.
Когда я получаю доступ к таким путям, как /banner, /rand, соединение Redis будет соответствующим, и следующий шаг будет выполняться в соответствии с этим соединением.Когда я выполняю код на сервере с помощью команды «python3 app.py», все нормально. Аналогично, когда я запускаю его на хосте с помощью команды «uvicorn app:app --host 0.0.0.0 --port 8000», проблем не возникает.
Когда я упаковываю код и развертываю его как Docker-контейнер , при выполнении предложения «db_size = await redis.dbsize()» происходит тайм-аут соединения. Однако тот же код можно запустить непосредственно на сервере с помощью команд python3 или univcorn.
вот мой исходный код
↓↓↓

Код: Выделить всё

import random
import uvicorn
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
import aioredis

app = FastAPI()
@app.get("/{path}")
async def root(path: str):
if path == 'banner':
storage_id = 0
elif path == 'rand':
storage_id = 1
else:
return {"code":502, 'msg':'bad request'}
print("before aioredis.from_url")
redis = aioredis.from_url(f"redis://**:*********@172.18.0.3/{storage_id}", decode_responses=True)
print("before await redis.dbsize()")
print("deadlock happened")
db_size = await redis.dbsize()
print("no deadlock")
n = random.randint(0, db_size-1)
pic_url = f"*****************"
pic_url += await redis.get(n)
return RedirectResponse(pic_url)
# return {'code':Response().status_code, 'imgurl': pic_url}

if __name__ == '__main__':
uvicorn.run(app, host="0.0.0.0", port=8000)
Сообщение об ошибке выглядит следующим образом:

Код: Выделить всё

aioredis.exceptions.TimeoutError: Timeout connecting to server
Доступ к сервису возможен через внешнюю сеть, но при выполнении соединения с Redis произошел тайм-аут.
Версия Python на моем сервере такая же, как версия, установленная docker
Я попробовал понизить версию Python с 3.10 до 3.9, но это не сработало.
Мне интересно, почему тот же код работает нормально при запуске непосредственно с python3 или uvicorn, но вызывает тайм-аут соединения Redis при запуске в контейнере Docker?
Я подключаюсь к Redis через аутентификацию ACL и настроил права доступа для IP-адреса контейнера. Так что я не думаю, что это неправильная настройка брандмауэра.

Код: Выделить всё

Finally, I was able to restore it to normal by setting the "--network host" option to the docker container, which reminded me of the same problem when I deployed cloudflare tunnel before... What is the reason?


Подробнее здесь: https://stackoverflow.com/questions/790 ... is-are-dep
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»