执行"config rewrite"报"Permission denied"
一、问题描述
今天在docker容器运行的Redis上,使用redis-cli修改一些配置,配置修改完毕后,打算使用config rewrite回写到redis.conf中,这个时候客户端弹出如下错误:

二、如何排查及解决
从错误信息来看,是由于文件目录的权限不够所导致的,那如何排查的呢?我们首先需要知道,当我们执行config rewrite回写的时候,其实是容器内的redis用户(UID 999)在尝试写入,同时Redis在执行该命令时,并不会直接修改redis.conf文件,而是会在同级目录下创建一个临时文件,写入新配置后,再将其重命名为原文件,这就要求不仅原文件对redis用户可写,其所在的目录也需要。
我们具体需要关注的目录和文件如下:
#容器外的挂载目录
/mydata/redis/conf
/mydata/redis/conf/redis.conf
#容器内部
/usr/local/etc/redis
/usr/local/etc/redis/redis.conf
我们可以使用如下命令去查看读写权限和所有者:
ls -nd xxx
经过排查发现:我在容器外的挂载目录和文件,所有者是root用户,redis用户没有权限无法写入。我的最终解决办法如下:
#将所有者更改为999,即redis用户
chown -R 999:999 /mydata/redis/conf
chown 999:999 /mydata/redis/conf/redis.conf
最终问题得以解决,如果还是不行的话,可以考虑是否是SELinux拦截的问题(网上看到的),执行如下命令:
getenforce
如果输出结果为:Enforcing,表明此时SELinux是处于开启状态,可以执行如下命令临时关闭:
setenforce 0
然后再去执行一下config rewrite看看行不行。当然还有个大保底的解决方案就是直接手动修改redis.conf文件,但是改完之后必须重启才能生效!!!

浙公网安备 33010602011771号