Когда я получаю доступ к таким путям, как /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
Версия 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
Мобильная версия