执行docker-compose up --build时Golang服务Redis连接拒绝错误求助
问题排查与解决方案
核心问题分析
从报错信息和配置来看,问题主要集中在连接地址配置错误、超时时间过短,以及容器启动就绪顺序的隐性问题。
具体修复步骤
1. 修正Redis连接地址为容器服务名
你的代码中仍使用localhost:6379,在Docker容器内部,localhost指向容器自身而非Redis容器。必须将地址改为redis:6379(对应docker-compose中Redis服务的名称):
client := redis.NewClient(&redis.Options{ Addr: "redis:6379", // 修改此处为Redis服务名 DB: 0, DialTimeout: 100 * time.Millisecond, ReadTimeout: 100 * time.Millisecond, })
注意:如果连接配置是从外部文件(如config.yml)读取,需同步修改配置文件中的Redis地址,而非仅修改代码。
2. 延长Redis连接超时时间
当前设置的DialTimeout和ReadTimeout仅100毫秒,即使Redis容器已启动,内部服务可能还未完全就绪,短超时会直接导致连接失败。建议延长至至少1-5秒:
client := redis.NewClient(&redis.Options{ Addr: "redis:6379", DB: 0, DialTimeout: 5 * time.Second, // 延长拨号超时 ReadTimeout: 3 * time.Second, // 延长读取超时 WriteTimeout: 3 * time.Second, // 新增写入超时(可选) })
3. 优化容器启动就绪检查(可选但推荐)
depends_on仅保证Redis容器先启动,不保证Redis服务已就绪。可以给Redis服务添加健康检查,确保Golang服务在Redis真正就绪后再启动:
修改docker-compose中Redis服务的配置:
redis: container_name: redis image: redis:latest ports: - 6379:6379 networks: - redis_test healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 3
同时给app服务添加健康检查依赖:
app: # 其他配置保持不变 depends_on: postgres: condition: service_started redis: condition: service_healthy # 等待Redis健康检查通过后再启动
4. 验证网络连通性(调试用)
如果以上步骤仍无效,可进入Golang容器内部测试与Redis的连通性:
# 进入myapp容器 docker exec -it myapp sh # 安装ping工具(若容器内未预装) apt update && apt install -y iputils-ping # ping Redis服务名,确认是否能解析到IP ping redis # 用telnet测试端口连通性 telnet redis 6379
如果ping不通或telnet失败,检查docker-compose中的网络配置:确认app和Redis都在redis_test网络中(你的配置已满足此条件,此步为验证)。
内容的提问来源于stack exchange,提问作者Aidana Erbolatova
相关产品推荐
相关产品推荐

