#docker #go
# #docker #Вперед
Вопрос:
У меня ошибка, из-за которой я не могу подключиться из своего приложения Go к своему контейнеру redis. Он работал не менее 2 недель, пока я не перезапустил свой компьютер, я не вижу, что могло измениться, и я убедился, что никакие другие контейнеры или процессы не используют тот же порт 6379.
Моя ошибка:
panic: failed to load incr lua script: EOF
goroutine 1 [running]:
code/website.connectToRedisLimiterDatabase(0x0, 0x0)
Я могу подключиться к контейнеру redis через свой cli:
//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(amp;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(amp;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
и сам файл docker:
FROM redis:6.0.9
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
Есть мысли?
Комментарии:
1. Если ваш redis внутри контейнера привязан к 127.0.0.1, то вы можете подключиться к нему только изнутри контейнера. Можете ли вы подключить его извне контейнера? Попробуйте 0.0.0.0
2. проблема заключалась в привязке 127.0.0.1 в файле docker, как вы упомянули, я удалил эту строку и перестроил, и она сработала. Должен ли я сохранить эту строку, но изменить номер? Также, пожалуйста, отправьте ответ, и я приму
Ответ №1:
Привязка к адресу 127.0.0.1 в контейнере redis разрешит соединения только внутри контейнера. Либо удалите строку, либо выполните привязку к 0.0.0.0, чтобы redis мог привязываться ко всем интерфейсам, а не только к обратному циклу.