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

