基于supervisor制作基于环境变量配置的redis

背景:

redis 的镜像很多很多,但都需要直接修改配置文件,不符合我们公司当前环境变量解决一切容易配置的思路。

材料:

1、CentOS-Base.repo

[base]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7

2、 epel.repo

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/epel/7/$basearch
gpgcheck=0
gpgkey=http://mirrors.cloud.aliyuncs.com/epel/RPM-GPG-KEY-EPEL-7

3、 start_shell.sh

#!/bin/bash
echo "update supervisor.config !"
if [ ! -d "/usr/local/pys/" ];then
mkdir -p /usr/local/pys/
else
echo "文件夹/usr/local/pys已经存在"
fi

cd /usr/local/pys/
for file in $(ls *)
do
  python $file
done
  echo "没有需要执行的py脚本"

cd /etc/redis/redis-6.2.6
for file in $(ls *)
do
  mkdir -p /etc/redis/redis-6.2.6/conf.d.bak/
  cp -rf $file ../conf.d.bak/$file.bak
done
sed -i "s/#REDIS_DAEMONIZE/$REDIS_DAEMONIZE/g"  `grep \#REDIS_DAEMONIZE -rl /etc/redis/redis-6.2.6`
sed -i "s/#REDIS_PORT/$REDIS_PORT/g"  `grep \#REDIS_PORT -rl /etc/redis/redis-6.2.6`
sed -i "s/#REDIS_TIMEOUT/$REDIS_TIMEOUT/g"  `grep \#REDIS_TIMEOUT -rl /etc/redis/redis-6.2.6`
sed -i "s/#REDIS_LOGLEVEL/$REDIS_LOGLEVEL/g"  `grep \#REDIS_LOGLEVEL -rl /etc/redis/redis-6.2.6`
sed -i "s/#REDIS_DATABASES/$REDIS_DATABASES/g"  `grep \#REDIS_DATABASES -rl /etc/redis/redis-6.2.6`
sed -i "s/#REDIS_APPENDONLY/$REDIS_APPENDONLY/g"  `grep \#REDIS_APPENDONLY -rl /etc/redis/redis-6.2.6`
sed -i "s/#REDIS_PROTECTED_MODE/$REDIS_PROTECTED_MODE/g"  `grep \#REDIS_PROTECTED_MODE -rl /etc/redis/redis-6.2.6`
sed -i "s/#REDIS_REQUIREPASS/$REDIS_REQUIREPASS/g"  `grep \#REDIS_REQUIREPASS -rl /etc/redis/redis-6.2.6`

time=$(date "+%Y-%m-%d %H:%M:%S")
filePath="/usr/project/supervisor_file.cfg"
if [ ! -f "$filePath" ];then
supervisorctl update all
sleep 10s
supervisorctl reload
touch $filePath
  echo $time > $filePath
  echo "成功创建认证文件"
else
  echo "已存在认证文件"
fi

4、supervisord.conf

[supervisord]
pidfile = /run/supervisord.pid
# It seems that it's not possible to swith this log to NONE (it creates NONE logfile)
logfile = /data/logs/supervisord.log
# Set loglevel=debug, only then all logs from child services are printed out
# to container logs (and thus available via `docker logs [container]`
loglevel = debug

# These two (unix_http_server, rpcinterface) are needed for supervisorctl to work
[inet_http_server]
port = :9111
username = sv
password = password

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl = http://localhost:9111
username = sv
password = password

[program:start-shell]
autostart=true
priority=111
startsecs=0
directory=/usr/project/
autorestart=unexpected
startretries=3
command = /bin/bash -c "chmod u+x start_shell.sh && ./start_shell.sh"
stdout_logfile=/var/log/startshell.log
stderr_logfile=/var/log/startshell_error.log

[program:]
command = redis-server /etc/redis/redis-6.2.6/redis.conf
startsecs=0
autostart=true
autorestart=true
stdout_logfile=/var/redis/log/redis-server.log
stderr_logfile=/var/redis/log/redis-server_error.log
stopasgroup=true
killasgroup=true

[include]
files = /etc/supervisor.d/*.ini

5、redis-6.2.6.tar.gz 

 下载对应版本的redis

6、redis.conf

1、解压redis-6.2.6.tar.gz 文件 获取redis.conf 配置文件
2、使用“#环境变量名”替换对应参数值(不是参数,是参数值,如#REDIS_DAEMONIZE替换文中的daemonize 后面的 yes/no).
#REDIS_DAEMONIZE daemonize
#REDIS_PORT 6379 port
#REDIS_TIMEOUT 0 timeout  当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
#REDIS_LOGLEVEL loglevel  指定日志级别记录,Redis共支持四个级别:debug、verbose、notice、warning,默认为verbose;一般生产环境配置为后两者
#REDIS_DATABASES 16 设置数据库的数量,默认数据库为0,可以使用select 命令在连接上指定数据库
#REDIS_APPENDONLY yes 指定是否在每次更新操作后进行日志记录(是否开启aof),Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电后导致一段时间内的数据丢失。因为Redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中;默认为no
#REDIS_PROTECTED_MODE no 
#REDIS_REQUIREPASS 123456

如下截图: 

# 1) The server is not binding explicitly to a set of addresses using the
#    "bind" directive.
# 2) No password is configured.
#
# The server only accepts connections from clients connecting from the
# IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain
# sockets.
#
# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.
protected-mode #REDIS_PROTECTED_MODE

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port #REDIS_PORT

# TCP listen() backlog.
#
# In high requests-per-second environments you need a high backlog in order
# to avoid slow clients connection issues. Note that the Linux kernel
# will silently truncate it to the value of /proc/sys/net/core/somaxconn so
# make sure to raise both the value of somaxconn and tcp_max_syn_backlog
# in order to get the desired effect.
tcp-backlog 511

7、Dockerfile

# base image
FROM docker.io/million12/centos-supervisor:latest

# MAINTAINER
MAINTAINER pengfeima@powerbridge.com

#初始化yum
RUN mkdir -p /etc/yum.repos.d/backup/ && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/

ADD CentOS-Base.repo epel.repo /etc/yum.repos.d/

RUN yum clean all && yum makecache

#中文编码
#RUN  yum update && yum -y install kde-l10n-Chinese telnet && yum -y install glibc-common && yum clean all  && localedef -c -f UTF-8 -i zh_CN zh_CN.utf8

ENV LC_ALL en_US.utf8

#解决AWT类库的问题
#RUN yum -y install fontconfig && fc-cache --force

#添加依赖库
RUN yum -y install gcc gcc-c++ make zlib-devel pcre-devel openssl-devel curl tree

# make a new directory to store the redis files
RUN mkdir /etc/redis

# copy the jdk  archive to the image,and it will automaticlly unzip the tar file
ADD redis-6.2.6.tar.gz /etc/redis/

#WORKDIR /etc/redis

# make a symbol link
RUN cd /etc/redis/redis-6.2.6 && pwd && make -f Makefile DEST_PATH=/etc/redis && make install
#add conf.d
ADD redis.conf /etc/redis/redis-6.2.6/

# change config
RUN mkdir -p /var/redis/data && mkdir -p /var/redis/log && chown +777 /var/redis /var/redis/log

#start redis
RUN useradd redis 

# set environment variables
ENV REDIS_HOME /etc/redis/
ENV PATH ${REDIS_HOME}/sbin:$PATH
ENV REDIS_DAEMONIZE no
ENV REDIS_PORT 6379
ENV REDIS_TIMEOUT 0
ENV REDIS_LOGLEVEL notice
ENV REDIS_DATABASES 16
ENV REDIS_APPENDONLY yes
ENV REDIS_PROTECTED_MODE no
ENV REDIS_REQUIREPASS 123456

# set supervisor.d

RUN mkdir -p /etc/supervisor.d && mkdir -p /usr/project
ADD start_shell.sh /usr/project/
ADD supervisord.conf /etc/

制作 :

材料备齐后只需要执行docker build -t 容器名:v1.0 . 即可

docker build -t redis:v1.0 .

亮点:1、针对下列截图中的参数修改只需要使用环境变量覆盖即可

REDIS_DAEMONIZE=no
REDIS_PORT=6379
REDIS_TIMEOUT=0
REDIS_LOGLEVEL=notice
REDIS_DATABASES =16
REDIS_APPENDONLY =yes
REDIS_PROTECTED_MODE=no
REDIS_REQUIREPASS =123456

如果不能满足需求,可以使用同样的语法分别修改  start_shell.sh,redis.conf、Dockerfile(别漏了)

2、该镜像很重,因为引入了完善的语言包,可以通过屏蔽Dockerfile中的中文编码库来减负(只是简体中文不需要这么复杂)

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值