You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis容器(host模式+环境变量端口)数据自动丢失问题求助

问题原因及解决方案

核心问题分析

你遇到的数据丢失问题,根源在于自定义启动命令的进程管理方式:

  • 当用["sh", "-c", "redis-server --port $${REDIS_PORT}"]启动时,容器内的PID 1进程是sh,而非redis-server
  • Docker停止容器时只会给PID 1进程发送终止信号(SIGTERM),但sh不会把这个信号转发给子进程redis-server,导致Redis被强制杀死,来不及将内存中的数据写入磁盘的RDB文件,重启后就会丢失未保存的数据
  • 而简化配置中,redis-server直接作为PID 1进程,能正常接收终止信号,完成数据持久化后再退出

修复方案(二选一即可)

方案1:用exec让Redis成为PID 1进程

修改command配置,通过exec替换sh进程,让redis-server成为容器的PID 1,这样就能正常接收终止信号:

redis:
  image: redis:alpine
  network_mode: host
  env_file: .env
  command: ["sh", "-c", "exec redis-server --port $${REDIS_PORT}"]
  volumes:
    - ./docker_data/redis/data:/data

方案2:加载官方默认配置文件+指定端口

直接调用官方镜像自带的Redis配置文件(包含预设的持久化策略),同时追加端口参数,这样既保留了默认的持久化配置,又能自定义端口,且Redis进程直接作为PID 1:

redis:
  image: redis:alpine
  network_mode: host
  env_file: .env
  command: ["redis-server", "/etc/redis/redis.conf", "--port", "${REDIS_PORT}"]
  volumes:
    - ./docker_data/redis/data:/data

验证方法

修改配置后重启容器,执行以下操作验证:

  • 写入测试键值:redis-cli -p <你的REDIS_PORT> set test_key "persist_test"
  • 手动停止容器:docker-compose stop redis
  • 重启容器:docker-compose up -d redis
  • 读取测试键:redis-cli -p <你的REDIS_PORT> get test_key
    如果返回"persist_test",说明数据持久化正常。

内容的提问来源于stack exchange,提问作者Danial Selmipoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:42:12