用于 redis-stack-server 持久化的 Docker-Compose 命令

mdi*_*bio 2 redis docker-compose redis-stack-server

如果我使用使用 docker compose 配置的默认redis docker 映像,如下所示:

redis-storage:
  image: redis:7.0
  container_name: 'redis-storage'
  command: ["redis-server", "--save", "1200", "32", "--loglevel", "warning"]
  volumes:
    - redis-storage-data:/data
Run Code Online (Sandbox Code Playgroud)

如果至少有 32 个更改,它会正常启动并每 20 分钟写入一次磁盘。

但是,如果我使用相同的command方法,image: redis/redis-stack-server:latest它似乎可以正常启动,但它实际上会进入保护模式并且变得无法访问。注释掉命令,一切正常。

command允许更改默认保存到磁盘参数的 docker-compose 格式正确的是什么?

(还尝试了替代语法command: redis-server --save 1200 32:)

mdi*_*bio 7

工作解决方案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
Run Code Online (Sandbox Code Playgroud)

找到一个清晰、不冲突的例子并不容易。还有一些历史错误。

对于redis-stack-server(当不使用安装到容器的本地redis-stack.conf文件时)底层redis的配置可以通过环境变量传入,REDIS_ARGS而不是直接传递到命令。(还有堆栈模块的环境变量,例如REDISJSON_ARGS等。

然而“保存”却特别挑剔。它需要两个参数(seconds, changes),但大多数配置参数需要一个。引用参数的某些形式会使其看起来像一个参数,并且底层参数解析器将被忽略或报告“参数数量错误”并将服务器置于保护模式。

对于save,您还可以指定多个条件。例如,默认值为:

save 3600 1 300 100 60 10000

(如果写入 1 次,则在 1 小时后保存;如果写入 100 次,则在 5 分钟后保存;如果写入 10000 次,则在 60 秒后保存)

对于原始redis容器,您可以使用以下格式在 docker-compose 中将其指定为命令行参数:

redis-storage:
  image: redis:7.0
  command: ["redis-server", "--save", "3600", "1", "300", "100", "60", "10000"]
  volumes:
    - my-redis-data:/data
Run Code Online (Sandbox Code Playgroud)

然而,底层参数解析逻辑会产生一个问题,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"  
Run Code Online (Sandbox Code Playgroud)

正确的语法很晦涩:

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

如果您docker exec进入正在运行的容器并调用redis-cli CONFIG GET save它将返回:

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

Run Code Online (Sandbox Code Playgroud)

Redis 开发人员文档中还有一个替代的 compose 语法示例

  environment:
    - REDIS_ARGS:--save 20 1
Run Code Online (Sandbox Code Playgroud)

但 compose schema 3.8 会抱怨(示例使用 schema 3.9)