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
以下是myDockerfile 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