Docker堆栈/编写Redis示例不保存数据

6xfqseft  于 2022-10-31  发布在  Redis
关注(0)|答案(2)|浏览(175)

我尝试在我的Sails.js应用程序中使用Redis作为缓存,但是我很难让卷正常工作,也很难让Redis示例自动保存数据。
下面是我的stack.yml文件(的相关部分):

redis:
  image: 'redis:latest'
  command: redis-server --appendonly yes
  command: ['redis-server', '--requirepass', 'mypasswordgoeshere']
  volumes:
    - ./redis-data:/data
  deploy:
    replicas: 1

我有一个Sails.js服务和一个Angular应用程序服务,但没有显示它们,因为它们在这里并不真正需要。
上面的内容并没有完全按照预期的开箱即用的方式工作。我希望Docker在没有./redis-data文件夹的情况下自动为我创建该文件夹,但实际上并没有。所以我必须创建这个文件夹并确保权限设置正确。然后我希望Redis容器将其数据保存到一个appendonly.aof文件中,并定期自动保存。当我尝试执行此操作时,在本地计算机上会发生什么情况。
然而,在服务器上,它没有为我保存appendonly.aof文件,因此我想要持久化的数据没有得到保存,这样当堆栈重新启动时它就在那里了。
最奇怪的是,我为Sails.js应用程序创建了一个卷来访问日志文件,而不需要为该应用程序创建文件夹;它只是创建了它,一切都按预期自行工作。我在这里错过了一些明显的东西吗?任何帮助都将不胜感激。谢谢!

编辑

此外,如果我进入容器(docker exec -it container_id /bin/bash),在它放置您的/data文件夹中没有任何内容。这解释了为什么在主机上也没有任何内容。

hc8w905p

hc8w905p1#

对于任何使用Redis Stack的人来说,解决我的问题的方法是添加以下内容

environment:
    REDIS_ARGS: --save 20 1

我假设参数的任何值,或者使用AOF模式,也可以工作,但是我还没有验证这一点。
我最初尝试将其指定为

command: redis-server --save 20 1

这是基于this教程的。但是,在运行docker-compose up时,这会导致ConnectionError("Connection is not ready")(源代码)。

rseugnpd

rseugnpd2#

为了让这个工作正常进行,我对Redis服务使用了以下定义:

redis:
    image: 'redis:latest'
    environment:
        - REDIS_PASS=mypassword
        - REDIS_APPENDONLY=yes
        - REDIS_APPENDFSYNC=always
    volumes:
        - ./redis-data:/data
    deploy:
        replicas: 1

使用environment变量或设置似乎可以按预期工作。
我是从Docker文档中的this mini tutorial得到这个想法的。我不太清楚为什么这样做是可行的,因为Docker Hub上的文档没有指定任何环境变量,实际上是说使用原始问题中提到的步骤,但不管怎样,这个解决方案确实可行。

相关问题