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
相关产品推荐
相关产品推荐

