Docker-Compose部署Python+Redis连接失败求助:Name or service not known
问题排查与解决方案
核心问题出在Walrus连接参数的格式错误:你给Database的host参数传了带redis://协议前缀的字符串,但Walrus的host只需要纯主机名(或IP),不需要协议头。当前配置下,程序会把redis://redis当作完整的主机名去解析,这显然不符合DNS规则,导致连接失败。
具体修改步骤
1. 修正环境变量中的REDIS_HOST值
- 修改
docker-compose.yml中consumers服务的环境变量:environment: - REDIS_HOST=redis - 修改
Dockerfile中的环境变量设置:ENV REDIS_HOST=redis
2. 保持Python连接代码不变
你的现有代码逻辑没问题,只要环境变量是纯主机名即可:
rdb = Database(host=os.getenv("REDIS_HOST", "localhost"), port=6379)
额外排查点
- 确认Redis容器正常启动:执行
docker-compose logs redis查看日志,确保redis-server成功启动并监听6379端口。 - 处理服务就绪延迟:
depends_on仅保证容器启动顺序,不保证Redis服务完全就绪。可以在Python代码中添加连接重试逻辑,比如:import os from walrus import Database import time def get_redis_connection(): while True: try: rdb = Database(host=os.getenv("REDIS_HOST", "localhost"), port=6379) # 测试连接 rdb.ping() return rdb except Exception as e: print(f"Failed to connect to Redis, retrying in 2s: {e}") time.sleep(2) rdb = get_redis_connection() - 测试容器间网络连通性:进入
consumers容器执行ping redis,如果能ping通说明网络没问题,问题还是出在连接参数上。
内容的提问来源于stack exchange,提问作者Solly
相关产品推荐
相关产品推荐

