现象如下:
看了报错是权限问题,然后发现redis1.conf的权限果然不大对,
所以运行 chmod o+r 添加权限
但是启动后容器自动退出:
然后把redis-server改成绝对路径/usr/local/bin/redis-server
此时就能发现报错真正的原因:是原始redis.conf配置文件内容的问题,而不是文件本身挂载的问题。 这里提示的其实就是容器内部没有/var/lib/redis这个路径
然后创建一个docker 存储卷,并挂载给/var/lib/redis
docker volume create myvolume
docker run --name xxxx -v myvolume:/var/lib/redis xxxxxx
但是容器还是自动退出了:
最后发现是redis配置文件中的daemonize yes选项在作怪,把它注释掉或者设成no
然后容器终于不再自动退出了可以正常启动了, 但是又报错
Failed opening the RDB file dump.rdb (in server root dir /var/lib/redis) for saving: Permission denied
看起来还是权限问题:
这个错误表明 Redis 在持久化数据时无法打开 RDB 文件进行保存时,缺少写入权限。这通常是由于挂载的存储卷myvolume的权限问题导致的。
经过测试发现:给存储卷挂载时加:rw参数也是无效的
解决办法是:在宿主机redis配置文件所在的目录,创建一个tmp目录,然后给777权限,
然后把这个目录挂载给容器/var/lib/redis路径
mkdir tmp
chmod 777 tmp
docker run --name xxxx -v `pwd`/tmp:/var/lib/redis xxxxx
需要注意一点:
redis.conf里面不要有logfile配置选项,否则docker logs 就没有日志输出了
总结一下:
解决docker运行redis报错:Fatal error, can't open config file /etc/redis/redis.conf以及启动redis后自动退出容器问题的解决办法:
1. 被挂载的redis.conf配置文件必须有足够的权限,能被root用户以外的用户所读取, 也就是能被docker容器内部读取
2. redis.conf配置文件一定不能有daemonize yes选项,这也是redis容器自动退出的关键原因。
3. 需要从宿主机路径从外部挂载到容器内部路径/var/lib/redis, 否则会报错:Can't chdir to '/var/lib/redis': No such file or directory
4. 如果启用了redis持久化, 那么 容器内部路径/var/lib/redis也是需要读写权限的
解决办法:在宿主机redis配置文件所在的目录,创建一个tmp目录,然后给777权限,
然后把这个目录挂载给容器/var/lib/redis路径
mkdir tmp
chmod 777 tmp
docker run --name xxxx -v `pwd`/tmp:/var/lib/redis xxxxx