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

在Docker容器中以非root用户运行Redis Sentinel镜像的run.sh脚本

嘿,我来帮你搞定Redis Sentinel镜像里run.sh以非root用户运行的问题,结合你给出的脚本片段,咱们一步步调整到位:

1. 先在Dockerfile里配置非root用户

首先得在构建镜像时创建一个非root用户,并且确保所有相关文件和目录的权限都归这个用户所有。这里我用ubuntu用户举例,你也可以自定义:

# 基于官方Redis镜像(选合适的版本,比如latest或者指定版本)
FROM redis:latest

# 创建带家目录的非root用户
RUN useradd -m ubuntu

# 创建Sentinel配置目录并设置权限
RUN mkdir -p /home/ubuntu/sentinel && chown -R ubuntu:ubuntu /home/ubuntu/sentinel

# 复制你的run.sh脚本到用户目录,赋予执行权限并修改归属
COPY run.sh /home/ubuntu/
RUN chmod +x /home/ubuntu/run.sh && chown ubuntu:ubuntu /home/ubuntu/run.sh

# 切换到非root用户,后续命令都以这个身份执行
USER ubuntu

# 容器启动命令
CMD ["/home/ubuntu/run.sh"]
2. 修正并完善你的run.sh脚本

你给出的脚本片段有几个小细节可以优化,同时确保非root用户能正常执行:

#!/bin/bash

while true; do
    # 从Sentinel获取主节点地址,处理CSV格式的输出去掉引号和逗号
    master=$(redis-cli -h ${REDIS_SENTINEL_SERVICE_HOST} -p ${REDIS_SENTINEL_SERVICE_PORT} --csv SENTINEL get-master-addr-by-name mymaster | tr ',' ' ' | cut -d'"' -f2)
    
    # 如果没获取到主节点地址, fallback到当前容器的IP
    if [[ -z ${master} ]]; then
        master=$(hostname -i)
    fi

    # 测试与主节点的连接,屏蔽冗余输出
    redis-cli -h ${master} INFO > /dev/null 2>&1
    if [[ "$?" == "0" ]]; then
        echo "✅ Successfully connected to master node: ${master}"
        break
    fi

    echo "❌ Failed to connect to master. Retrying in 10 seconds..."
    sleep 10
done

# 启动Redis Sentinel服务(补全你脚本里的后半部分)
sentinel_conf=/home/ubuntu/sentinel/sentinel.conf
redis-server ${sentinel_conf} --sentinel

这里的优化点:

  • 修正了master变量的截取逻辑,原来的方式可能会残留引号,用cut -d'"' -f2更精准
  • 把redis-cli INFO的输出重定向到/dev/null,避免不必要的日志干扰
  • 增加了更清晰的成功/失败提示,方便调试排查
  • 确保所有路径都指向非root用户有权限访问的/home/ubuntu目录
3. 关键注意事项
  • 权限检查:一定要确保Sentinel配置文件、脚本、日志目录(如果有的话)都属于非root用户,否则运行时会出现权限拒绝错误
  • 端口选择:Redis Sentinel默认用26379端口(属于非特权端口,端口号>1024),非root用户可以直接绑定;如果必须用特权端口(<1024),需要额外配置capabilities,但不推荐这么做,尽量用非特权端口
  • 环境变量传递:运行容器时要确保REDIS_SENTINEL_SERVICE_HOST和REDIS_SENTINEL_SERVICE_PORT这两个环境变量能正确传入,比如用docker run -e REDIS_SENTINEL_SERVICE_HOST=xxx ...或者在Kubernetes的Deployment里配置env字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:30:04