在 Docker 中修改了 Redis 配置后试图使用 CONFIG REWRITE 命令会报错:
(error) ERR The server is running without a config file
个人认为在 Docker 容器内运行 Redis 时,可能会出现:修改配置后 Docker容器临时 stop,restart 后由于 Docker 容器无状态特性修改的配置丢失的情景,所以有必要研究如何将配置持久化
宿主机环境:Windows 10 专业版
失败的尝试:
下文中的xxxxx
为文件所在绝对路径
-
试图在容器内根据 Redis 配置文件的常用路径手动查找
.conf
配置文件,发现根本找不到 -
试图将 Windows 宿主机内的 Redis 配置文件挂载进容器,报错相同,配置文件并不会被引用:
docker run -d -v xxxxxxxxx\db1\data:/data -v xxxxxxxx\db1\redis-stack.conf:/redis-stack-server.conf -p 127.0.0.1:6379:6379 --name redis-db1 redis/redis-stack-server:latest
-
询问GPT4后试图在Redis启动参数中将Windows宿主机内的配置文件强行引入,但引入后从docker外无法连接Redis:
Error: Server closed the connection
且在docker内终端试图使用 CONFIG REWRITE 命令仍然会报错:
ERR Rewriting config file: Device or resource busy
怀疑可能是 Redis 进程本身或是 Docker 容器进程正在使用文件导致占用
docker run -d -v xxxxxxx\db1\data:/data -v xxxxxxxx\db1\redis-stack.conf:/usr/local/etc/redis/redis.conf -p 127.0.0.1:6379:6379 --name redis-db1 redis/redis-stack-server:latest redis-server /usr/local/etc/redis/redis.conf
-
试图使用http://download.redis.io/redis-stable/redis.conf下载的配置文件挂载,在容器启动时即报错配置文件参数有误
解决方案
ERR Rewriting config file: Device or resource busy
该报错并不是告知文件被占用,还有可能来源于文件没有写入权限
为了让 Redis 有权限修改配置,必须挂载整个配置文件夹,而不是文件本身,并且文件夹权限应该开放可写
根据上文修改 Docker 命令为:
docker run -d -v xxxxxxx\db1\data:/data -v xxxxxxxx\db1\conf\:/usr/local/etc/redis/ -p 127.0.0.1:6379:6379 --name redis-db1 redis/redis-stack-server:latest redis-server /usr/local/etc/redis/redis-stack-server.conf
成功执行 CONFIG REWRITE 命令,配置文件在容器运行时成功被命令行更改