Разрешение Redis отклонено при открытии dump.rdb - PullRequest
0 голосов
/ 22 января 2019

Я использую официальное redis изображение с sidekiq на dockers.

Ниже приведены 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

Ниже приведен код моего 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 показывает следующее permission ошибка:

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, но у меня это не сработало. Я также попробовал вышеуказанные конфигурации Dockerfile-redis с пользователем redis, но все равно получаю ту же ошибку permission denied при открытии файла dump.rdb.

Я не знаю, что я здесь делаю неправильно. Пожалуйста, помогите мне с этим

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

После часа бездействия Redis попытается вывести дб памяти на диск.

Redis из официального образа redis пытается записать файл .rdb в папку контейнеров /data, что весьма прискорбно, так как это корневая папка, а также непостоянное расположение (данные написанное там исчезнет, ​​если ваш контейнер / контейнер выйдет из строя).

Таким образом, после часа бездействия, если вы запустили свой контейнер redis от имени пользователя, не являющегося пользователем root (например, docker run -u 1007 вместо значения по умолчанию docker run -u 0), в вашем журнале появится сообщение с подробным сообщением об ошибке ( см 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

Итак, вам нужно сопоставить папку /data контейнера с внешним местоположением (где пользователь без полномочий root, здесь: 1007, имеет доступ для записи), например:

docker run --rm -d --name redis -p 6379:6379 -u 1007 -v /tmp:/data redis
0 голосов
/ 23 января 2019

Кажется, что официальный образ redis использует аппликативного пользователя для запуска сервера redis, а не 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

при монтировании тома в контейнер, он принадлежит пользователю root, он переопределяет каталог по умолчанию в слое изображения вместе с предыдущими разрешениями.

Кажется, что намерения redis-образане нужно было выставлять каталог '/ var / lib / redis' в качестве тома, вместо этого они предлагают монтирование к / data / ' для сохранения:

Если сохранение включеноданные хранятся в VOLUME / data, который можно использовать с --volumes-from some-volume-container или -v / docker / host / dir: / data (см. разделы docs.docker).

Подробнее о постоянстве Redis см. http://redis.io/topics/persistence.

...