Docker:MISCONF Redis 配置为保存 RDB 快照

4

有几个类似的问题,例如:

Redis已配置保存RDB快照,但当前无法持久化到磁盘-Ubuntu服务器

MISCONF Redis已配置保存RDB快照,但当前无法持久化到磁盘。禁用可能修改数据集的命令

但这些都不能解决我的问题。

问题是我在docker-compose中运行我的redis,而且就是不知道如何在docker-compose启动时解决这个问题。

Redis文档说这是解决方法:

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) 覆盖入口点:

custom-entrypoint.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

这个也不起作用。

如何修复这个问题?

2个回答

0
曾经处于同样的情况。在 Docker 中检查了我的空间使用情况,发现我已经用完了分配给 Docker 的免费虚拟机磁盘空间。
如果你安装了 Docker Dashboard,你可以使用它来检查,或者通过运行 docker system df 命令来检查。
通过增加分配给 Docker 的虚拟机磁盘空间,或者通过运行 docker image prune 命令来回收磁盘空间,我成功地使用 Docker Compose 正常运行了 Redis。

-1

简而言之:你的Redis不安全

更新: 使用expose代替ports,这样服务只对链接的服务可用

Expose ports without publishing them to the host machine - they’ll only be accessible to linked services. Only the internal port can be specified.

expose
 - 6379

原始答案:

长答案:

这可能是由于未安全设置的redis-server实例引起的。Docker容器中的默认Redis映像是不安全的。

我能够使用redis-cli -h <我的服务器IP>连接到我的Web服务器上的Redis。

为了解决这个问题,我查阅了这篇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 路径和 volumes 应该匹配。

  • 根据需要重新构建 Redis 或所有服务
  • 尝试使用 redis-cli -h <my-server-ip> 进行验证(对我来说停止工作了)

通过不公开端口来保护Redis,这样能解决overcommit_memory错误吗? - undefined
@Tim 这是对我来说解决了相同错误信息的方法。我之前也尝试过上面问题中提到的相关链接,并且还尝试使用 ufw 阻止外部访问该端口。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接