Docker设置sentry_redis内存限制报镜像不存在错误排查
问题根因
两个核心认知误区导致操作无效:
sentry_redis是docker-compose生成的运行中容器名,不是镜像名。直接执行docker run sentry_redis时,Docker会默认将输入值识别为镜像名,去公共镜像仓库拉取不存在的sentry_redis:latest镜像,自然会报拉取权限错误。- 单独修改Redis内部
maxmemory参数不生效通常有两个原因:一是修改的本地配置文件没有正确挂载到容器内,Redis实际加载的是默认配置;二是只配置了maxmemory但没有配置对应的内存淘汰策略,内存达到阈值后不会自动清理key,同时Docker默认没有给容器设置内存硬限制,Redis可以占用宿主机全部可用内存。
排查步骤
- 执行
docker inspect sentry_redis | grep Image,确认容器实际使用的镜像名称,明确区分容器名与镜像名的差异。 - 执行
docker exec -it sentry_redis redis-cli CONFIG GET maxmemory、docker exec -it sentry_redis redis-cli CONFIG GET maxmemory-policy,查看Redis运行时实际加载的内存参数,确认本地修改的配置是否真的在容器内生效。 - 执行
docker inspect sentry_redis | grep -A 5 Memory,查看当前容器的cgroup内存限制配置,默认未做限制的容器可以使用宿主机全部内存。
解决方案
永久生效方案(推荐)
Sentry自托管版本基于docker-compose编排,直接修改编排文件配置即可永久生效:
- 进入Sentry自托管部署的根目录,找到
docker-compose.yml文件,定位到redis服务段(容器名sentry_redis是compose自动生成的,对应编排文件内的服务名是redis)。 - 在redis服务配置下新增内存限制与Redis运行参数,注意给Redis进程预留少量缓冲内存,避免触碰Docker硬限制被OOM杀掉:
services: redis: # 保留原有image、volumes等默认配置不要修改 mem_limit: 2g mem_reservation: 1g command: redis-server --maxmemory 1800mb --maxmemory-policy allkeys-lru
- 保存配置后执行
docker-compose up -d redis,重建redis容器即可生效,不会影响其他Sentry服务正常运行。
临时验证方案
如果需要快速验证限制效果、不用重建容器,可以直接给运行中的容器动态更新内存限制:
docker update --memory 2g --memory-swap 2g sentry_redis
该配置会立即生效,但容器重建后会失效,最终还是需要修改docker-compose配置固化参数。
注意:不要用
docker run命令操作已经被docker-compose管理的服务,docker run的作用是创建并启动全新容器,和现有运行中的同名容器没有关系。针对compose服务的操作优先使用docker-compose系列命令,针对单个运行中容器的调整可以用docker update/docker exec等命令。
内容的提问来源于stack exchange,提问作者Eng7
相关产品推荐
相关产品推荐

