背景: 当前项目中的logstash使用docker 容器启动,因为客户要求要把配置文件中的数据库的密码用加密后的字符串代替,考虑到logstash已有的加密方案,使用keystore 将字符串加密到对应的文件中 配置文件中的密码则用变量代替
现在有一个问题就是 我无法在初始化启动的时候很好的
给logstash 加入这个bim
的变量
原因 : 容器第一次启动时,logstash中是没有这个${bim}
的且我也没有找到如何在初始化时就给logstash 内置这个变量,且容器启动时需要初始化keystore
# 初始化keystore 我在镜像制作的过程中做了这一步
./bin/logstash-keystore create
添加变量
./bin/logstash-keystore add bim
我现在的方案就是在容器第一次启动时 通过shell脚本去添加这个变量
docker exec -it logstash bin/logstash-keystore add bim
出现上述的一行(Enter value for BIM_PASS:
)的时候就快速的去输入对应库的密码 并敲回车
这样做有一个弊端就是,容器初始化的时候是没有bim这个变量 但是我配置文件中又写了的
且手动添加这变量的过程需要去调用java的api 且速度很慢,容器启动过程中会一直去内存中读取
对应的变量,如果没有读取到 会在大概40秒左右的时候超时 而这个时候如果上面的脚本还没有加载
完毕 容器就会重启
那么用户就会重新来执行一遍docker exec -it logstash bin/logstash-keystore add BIM_PASS
这样的体验很不好 请问各位大佬 有什么可以改进的吗?
直接在镜像制作的过程中使用非交互式的方式 指定一个默认值?
想到一个方法,在创建这个容器之前,提前准备好logstash.keystore文件,然后在适当的时候把这个文件放到容器里面(可以在构建镜像的时候加进去)
这样,在容器内就不需要再使用
logstash-keystore add
添加了,这样做可以直接在容器内部使用密码。只要在启动logstash容器的时候,把logstash.keystore的密码传进去,传一个
LOGSTASH_KEYSTORE_PASS
环境变量。