Команда Docker-Compose для сохраняемости redis-stack-server

Если я использую образ докера redis по умолчанию , настроенный с помощью docker compose, как таковой:

      redis-storage:
  image: redis:7.0
  container_name: 'redis-storage'
  command: ["redis-server", "--save", "1200", "32", "--loglevel", "warning"]
  volumes:
    - redis-storage-data:/data

он запускается нормально и пишет на диск каждые 20 минут, если хотя бы 32 изменения.

Но если я использую то же самое сimage: redis/redis-stack-server:latestвроде запускается нормально, но на самом деле переходит в защищенный режим и становится недоступным. Комментируя команду, все работает нормально.

Что правильноcommandв формате docker-compose, который позволит изменить параметры сохранения на диск по умолчанию?

(Также пробовал альтернативный синтаксис:command: redis-server --save 1200 32)

1 ответ

Рабочее решение дляdocker-compose schema '3.8':

      redis-stack-svc:
  image: redis/redis-stack-server:latest
  # use REDIS_ARGS for redis-stack-server instead of command arguments
  environment:
    - REDIS_ARGS=--save 1200 32
  volumes:
    - my-redis-data:/data

Нелегко найти четкий, непротиворечивый пример. И какой-то исторический баг.

Дляredis-stack-server(если не используется локальныйredis-stack.confфайл, смонтированный в контейнере) конфигурация базового Redis может быть передана черезREDIS_ARGSпеременная окружения, а не непосредственно в команду. (Существуют также переменные окружения для модулей стека, напримерREDISJSON_ARGS, и т. д.

Однако « сохранить » особенно суетлив. Он ожидает два аргумента(seconds, changes)но большинство параметров конфигурации ожидают один. Некоторые формы заключения аргументов в кавычки делают их похожими на один аргумент, а базовый анализатор аргументов либо игнорируется, либо сообщает о « неправильном количестве аргументов » и переводит сервер в защищенный режим.

Дляsave, вы также можете указать несколько условных выражений. Например, по умолчанию:

save 3600 1 300 100 60 10000

(Сохранение через 1 час, если 1 запись, через 5 минут, если 100 записей, через 60 секунд, если 10000 записей)

Для оригиналаredisконтейнер, вы можете указать это в docker-compose в качестве аргументов командной строки, используя следующий формат:

      redis-storage:
  image: redis:7.0
  command: ["redis-server", "--save", "3600", "1", "300", "100", "60", "10000"]
  volumes:
    - my-redis-data:/data

Однако базовая логика разбора аргументов создает проблему дляredis-stackОба эти формата будут проанализированы неправильно:

        # (valid syntax but ignored...'save' is actually set to 'nil')
  environment: 
    - REDIS_ARGS=--save 3600 1 300 100 60 10000
  
  # ('invalid number of arguments', server not started) 
  environment:
    - REDIS_ARGS="--save 3600 1 300 100 60 10000"  

Правильный синтаксис неясен:

        # (using non-default values here to validate the behavior) 
  environment:
    - REDIS_ARGS=--save 3602 1 --save 302 100 --save 62 10000

Если выdocker execв работающий контейнер и вызватьredis-cli CONFIG GET saveон вернется:

      root@f45860:/data# redis-cli CONFIG GET save
1) "save"
2) "3602 1 302 100 62 10000"

также есть пример альтернативного синтаксиса компоновки.В документации разработчика Redis

        environment:
    - REDIS_ARGS:--save 20 1

но составная схема 3.8 будет жаловаться (в примере используется схема 3.9)

Другие вопросы по тегам