当前位置: 首页 > 知识库问答 >
问题:

打开转储时拒绝Redis权限。rdb公司

薛弘济
2023-03-14

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

以下是redis图像的yml配置:

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

以下是我的Dockerfile-redis的代码:

FROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

当我构建图像时,一切正常,但过了一段时间后,docker compose logs会显示以下权限错误:

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打开转储的权限。rdb文件。我也遵循了这个解决方案,并在我的Dockerfile redis中做了如下更改,以向根目录授予对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

我已经为dir尝试了755,为dbfilename尝试了644,但它对我不起作用。我还尝试了使用redis用户的Dockerfile-redis的上述配置,但我仍然在打开dump.rdb文件时收到相同的权限被拒绝错误。

我不知道我在这里做错了什么。请帮我做这个

共有3个答案

於子晋
2023-03-14

从根目录启动docker容器,例如:

redis:
  build: .
  dockerfile: Dockerfile-redis
  user: root <-- REQUIRE
  ports:
    - '6379:6379'
  volumes:
    - 'redis:/var/lib/redis'
洪飞龙
2023-03-14

官方redis映像似乎使用应用用户来运行redis-server,而不是root(这是一种安全最佳实践),无论用户定义如何-我从映像的入口点外壳脚本中提取了这一点:

# 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”目录作为卷公开,而是提供装载到“/data/”以实现持久性:

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

有关Redis持久性的更多信息,请参阅http://redis.io/topics/persistence.

魏君博
2023-03-14

一小时不活动后,Redis将尝试将内存db转储到磁盘。

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

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

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

因此,您需要做的是将容器的/数据文件夹映射到一个外部位置(非根用户,这里是1007,具有写访问权限),例如:

docker run --rm -d --name redis -p 6379:6379 -u 1007 -v /tmp:/data redis
 类似资料:
  • 问题内容: 我在ubuntu 12.04上使用ubuntu apt-get安装了Redis服务器2.8。 我已经从其他数据库复制了dump.rdb。现在,当我尝试启动新服务器时,我不断得到: 我该如何解决? 问题答案: 您应该检查 redis.conf* 文件以查看 dir 和 dbfilename中 的权限。如果位于 dir 路径指定的路径中的 dbfilename 中命名的文件存在,并且权限也

  • 我使用的是redis版本3.0.6。redis-server进程正在由redis用户运行。 突然从24小时后的5天开始,redis开始失败“打开. rdb进行保存”在此之前它工作正常。 正如您在下面的日志片段中所看到的,Redis表现正常,然后开始失败。服务器重启后解决了问题。 那么,我的问题是:这怎么会发生?请给我一个合适的解决方案。

  • 我在Debian服务器8.5上运行Redis服务器2.8.17。我使用Redis作为Django 1.8.4应用程序的会话存储。 我已经有几个月没有更改服务器上的软件配置了,一切正常,直到一周前Django开始出现以下错误: 我查看了redis日志,发现这种情况大约每秒发生一次: 我已经读了这两个SO问题1,2,但是他们没有帮助我找到问题。 ps显示用户“redis”正在运行服务器: 我检查了配置

  • 我在Debian Server8.5上运行Redis Server2.8.17。我使用Redis作为Django1.8.4应用程序的会话存储。 我读过这两个问题1,2,但它们没有帮助我找到问题。 ps显示用户“Redis”正在运行服务器: 我检查了配置文件中的redis文件名和路径: 但是当我检查输出时,我没有看到任何错误。特别是,我没有看到“权限被拒绝”错误,正如我所期望的那样。 另外,/var

  • 我无法使用ssh密钥访问我的repo。当我尝试将git推送到gitlab上的代表时,它会询问密码短语。 我从头开始的步骤。我要到~/. ssh/和此文件夹中的所有文件。然后: > 创建ssh密钥mymail@gmail.com“-b 4096 然后在~/. ssh/