Команда 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)