Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 打开dump.rdb时拒绝Redis权限_Ruby On Rails_Redis_Docker Compose_Digital Ocean_Sidekiq - Fatal编程技术网

Ruby on rails 打开dump.rdb时拒绝Redis权限

Ruby on rails 打开dump.rdb时拒绝Redis权限,ruby-on-rails,redis,docker-compose,digital-ocean,sidekiq,Ruby On Rails,Redis,Docker Compose,Digital Ocean,Sidekiq,我在dockers上使用官方redis图像和sidekiq 以下是yml配置的redis图像: redis: build: . dockerfile: Dockerfile-redis ports: - '6379:6379' volumes: - 'redis:/var/lib/redis' sidekiq: build: . command: bundle exec sidekiq links: - db - redis vo

我在
dockers
上使用官方
redis
图像和
sidekiq

以下是
yml
配置的
redis
图像:

redis:
  build: .
  dockerfile: Dockerfile-redis
  ports:
    - '6379:6379'
  volumes:
    - 'redis:/var/lib/redis'

sidekiq:
  build: .
  command: bundle exec sidekiq
  links:
    - db
    - redis
  volumes:
    - .:/app
  env_file:
    - .env
以下是my
Dockerfile redis的代码:

FROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
1:M 29 Jun 2019 21:11:22.014 * 1 changes in 3600 seconds. Saving...
1:M 29 Jun 2019 21:11:22.015 * Background saving started by pid 499
499:C 29 Jun 2019 21:11:22.015 # Failed opening the RDB file dump.rdb (in server root dir /data) for saving: Permission denied
1:M 29 Jun 2019 21:11:22.115 # Background saving error
当我构建图像时,一切正常,但经过一段时间后,
docker compose log
显示以下
权限
错误:

redis_1          | 98:C 22 Jan 2019 18:40:10.098 # Failed opening the RDB file dump.rdb (in server root dir /var/lib/redis) for saving: Permission denied
redis_1          | 1:M 22 Jan 2019 18:40:10.203 # Background saving error
我已经尝试了很多解决方案,但是我仍然在日志中遇到这个错误。redis每次打开
dump.rdb
文件的权限都被拒绝。我还遵循了解决方案,并在我的
Dockerfile redis
中做了如下更改,以向
root
授予
redis

USER root
CMD chown -R root:root /var/lib/redis/
CMD chown 777 /var/lib/redis/
CMD chown 777 /var/lib/redis/dump.rdb
我尝试了
755
dir
644
dbfilename
,但对我不起作用。我还使用
redis
用户尝试了
Dockerfile redis
的上述配置,但我仍然得到了打开
dump.rdb
文件时相同的
权限被拒绝
错误


我不知道我做错了什么。请帮我解决这个问题

无论用户定义如何,官方redis映像似乎使用应用程序用户来运行redis服务器,而不是root(这是一种安全最佳实践)-我从映像的入口点shell脚本中提取了以下内容:

# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
    find . \! -user redis -exec chown redis '{}' +
    exec gosu redis "$0" "$@"
fi
将卷装入容器时,该卷归根用户所有,它将覆盖映像层中的默认目录以及以前的权限

redis映像的意图似乎不是将“/var/lib/redis”目录作为卷公开,而是提供持久性:

如果启用了持久性,数据将存储在卷/数据中,可以与来自某个卷容器的--volumes或-v/docker/host/dir:/data一起使用(请参见docs.docker volumes)

有关Redis持久性的更多信息,请参阅


一小时不活动后,Redis将尝试将内存数据库转储到磁盘

官方
Redis
图像中的Redis试图在containers
/data
文件夹中写入.rdb文件,这是非常不幸的,因为它是root所有的文件夹,也是一个非持久性位置(如果容器/pod崩溃,写入其中的数据将消失)

因此,在一个小时的不活动之后,如果您以非root用户身份运行
redis
容器(例如
docker run-u 1007
而不是默认的
docker run-u 0
),您将在日志中得到一条非常详细的错误消息(请参见
docker logs redis
):

因此,您需要做的是将容器的
/data
文件夹映射到外部位置(非root用户在此:1007具有写访问权限),例如:

docker run --rm -d --name redis -p 6379:6379 -u 1007 -v /tmp:/data redis