Warm tip: This article is reproduced from serverfault.com, please click

go-连接到Redis Docker容器时出错

(go - Error when connecting to redis docker container)

发布于 2020-11-28 23:20:09

我无法从Go应用程序连接到Redis容器时遇到错误。它已经运行了至少2周,直到我重新启动计算机之前,我看不到有什么变化,并且确保没有其他容器或进程使用同一6379端口。

我的错误:

panic: failed to load incr lua script: EOF

goroutine 1 [running]:
code/website.connectToRedisLimiterDatabase(0x0, 0x0)

我可以通过cli连接到redis容器:

//exec inside
docker exec -it container-name redis-cli

// set value
set name "test"

// get value
get name
// shows test

这是我的go代码中出现错误的地方:

redisLimiter "github.com/ulule/limiter/v3/drivers/store/redis"
redisSessions "github.com/rbcervilla/redisstore/v8"

// RedisLimiterInstance contains the Redis limiter client and store objects
type RedisLimiterInstance struct {
    Client redisLimiter.Client
    Store  limiter.Store
}

// RedisSessionInstance contains the Redis session client and store objects
type RedisSessionInstance struct {
    Client *redis.Client
    Store  *redisSessions.RedisStore
}

var redisLimiterInstance RedisLimiterInstance
var redisSessionInstance RedisSessionInstance


func connectToRedisLimiterDatabase() error {
    redisLimiterClient := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // no password set
        DB:       0,  // use default DB
    })

    store, err := redisLimiter.NewStoreWithOptions(redisLimiterClient, limiter.StoreOptions{
        Prefix:   "rate_limiter_",
        MaxRetry: 3,
    })
    if err != nil {
        panic(err)
    }
    // panic: failed to load incr lua script: EOF
    redisLimiterInstance = RedisLimiterInstance{
        Client: redisLimiterClient,
        Store:  store,
    }
    return nil
}

func connectToRedisSessionDatabase() error {
    redisSessionClient := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // no password set
        DB:       0,  // use default DB
    })
    // New default RedisStore
    store, err := redisSessions.NewRedisStore(context.Background(), redisSessionClient)
    if err != nil {
        log.Fatal("failed to create redis store: ", err)
    }

    store.KeyPrefix("session_")
    store.Options(sessions.Options{
        Path: "/",
        MaxAge:   86400 * 7,
        HttpOnly: false,

    })

    redisSessionInstance = RedisSessionInstance{
        Client: redisSessionClient,
        Store:  store,
    }
    return nil
}

通过docker桌面,容器显示:

Configuration loaded

Running mode=standalone, port=6379.

Server initialized

Ready to accept connections

我的conf文件就是:

bind 127.0.0.1
port 6379

泊坞窗文件本身是:

FROM redis:6.0.9

COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

有什么想法吗?

Questioner
Steven
Viewed
0
Burak Serdar 2020-11-29 11:41:21

绑定到redis容器中的地址127.0.0.1将仅允许来自容器内部的连接。删除该行或绑定到0.0.0.0,以便redis可以绑定到所有接口,而不仅仅是环回。