docker: MISCONF Redis настроен на сохранение снимков RDB - PullRequest
0 голосов
/ 18 марта 2020

Существует несколько проблем, похожих на эту, например:

Redis настроен для сохранения снимков RDB, но в настоящее время он не может сохраняться на диске - Ubuntu Server

MISCONF Redis настроен для сохранения снимков RDB, но в настоящее время не может сохраняться на диске. Команды, которые могут изменить набор данных, отключены

, но ни одна из них не решает мою проблему.

Проблема заключается в том, что я запускаю свой redis в docker -композиции и просто не могу понять, как это исправить при docker -композитном запуске.

redis docs говорит, что это исправление:

echo 1> / proc / sys / vm / overcommit_memory

И это работает, когда Redis установлен за пределами docker. Но как мне запустить эту команду с docker -compose?

Я попробовал следующее:

1) добавив команду:

services:
  cache:
    image: redis:5-alpine
    command: ["echo", "1", ">", "/proc/sys/vm/overcommit_memory", "&&", "redis-server"]
    ports:
      - ${COMPOSE_CACHE_PORT:-6379}:6379
    volumes:
      - cache:/data

это не работа:

 docker-compose up
Recreating constructor_cache_1 ... done
Attaching to constructor_cache_1
cache_1  | 1 > /proc/sys/vm/overcommit_memory && redis-server
constructor_cache_1 exited with code 0

2) Монтирование каталога /proc/sys/vm/.

Не удалось: оказывается, я не могу подключиться к каталогу / proc /.

3) Переопределение точки входа :

пользовательская точка входа. sh:


#!/bin/sh
set -e

echo 1 > /proc/sys/vm/overcommit_memory


# first arg is `-f` or `--some-option`
# or first arg is `something.conf`
if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
    set -- redis-server "$@"
fi

# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
    find . \! -user redis -exec chown redis '{}' +
    exec su-exec redis "$0" "$@"
fi


exec "$@"

docker -compose.yml:

services:
  cache:
    image: redis:5-alpine
    ports:
      - ${COMPOSE_CACHE_PORT:-6379}:6379
    volumes:
      - cache:/data
      - ./.cache/custom-entrypoint.sh:/usr/local/bin/custom-entrypoint.sh
    entrypoint: /usr/local/bin/custom-entrypoint.sh

Это тоже не работает.

Как это исправить?

1 Ответ

0 голосов
/ 02 мая 2020

TL; DR Ваш Redis небезопасен

ОБНОВЛЕНИЕ: Используйте выставить вместо ports, поэтому услуга доступна только для связанных служб

Предоставление портов без публикации их на хост-компьютере - они будут доступны только для связанных служб. Можно указать только внутренний порт.

expose
 - 6379

ОРИГИНАЛЬНЫЙ ОТВЕТ:

длинный ответ:

Возможно, это связано с незащищенным redis-server экземпляр. Изображение Redis по умолчанию в контейнере docker не защищено.

Мне удалось подключиться к redis на моем веб-сервере, используя всего лишь redis-cli -h <my-server-ip>

Чтобы разобраться, я просмотрел эту статью о DigitalOcean и многие другие, и смог закрыть порт.

  • Вы можете выбрать redis.conf по умолчанию из здесь
  • Затем обновите раздел docker -compose redis до (соответственно обновите пути к файлам)
redis:
    restart: unless-stopped
    image: redis:6.0-alpine
    command: redis-server /usr/local/etc/redis/redis.conf
    env_file:
      - app/.env
    volumes:
      - redis:/data
      - ./app/conf/redis.conf:/usr/local/etc/redis/redis.conf
    ports:
      - "6379:6379"

путь к redis.conf в command и volumes должен совпадать

  • перестроить Redis или все службы в соответствии с требованиями
  • попробуйте использовать redis-cli -h <my-server-ip> для проверки (у меня перестал работать)
...