Docker部署Logstash时,如何用secrets.properties传递配置变量?
可行方案汇总
针对你在Docker中部署Logstash时,需要从secrets.properties提取变量作为Logstash环境变量(如JDBC密码)的需求,以下是几个实用方案:
方案1:启动脚本预处理,将Properties转为环境变量
在Logstash容器启动前,通过自定义脚本读取secrets.properties的键值对,导出为环境变量后再启动Logstash。
- 编写预处理脚本(例如
load-secrets.sh):
#!/bin/sh # 读取secrets.properties并导出为环境变量 while IFS='=' read -r key value; do # 跳过注释行和空行 if [[ ! $key =~ ^# && -n $key ]]; then export "$key=$value" fi done < /path/to/secrets.properties # 执行Logstash启动命令 exec logstash "$@"
- 在K8s Chart中配置容器的
command或entrypoint,替换默认启动逻辑:
containers: - name: logstash image: docker.elastic.co/logstash/logstash:8.11.0 command: ["/bin/sh", "-c", "/path/to/load-secrets.sh"] volumeMounts: - name: secrets-properties mountPath: /path/to/secrets.properties subPath: secrets.properties
之后在Logstash配置中即可直接用${DB_PASSWORD}这类环境变量引用。
方案2:Logstash配置中直接读取Properties文件
利用Logstash的Ruby插件或内置变量语法,直接在配置里读取secrets.properties的内容。
方式A:使用${file:...}内置语法(需Logstash 7.10+)
如果你的Logstash版本支持,可直接在配置中引用文件内容:
input { jdbc { jdbc_connection_string => "jdbc:mysql://db-host:3306/mydb" jdbc_user => "db_user" jdbc_password => "${file:/path/to/secrets.properties:db_password}" jdbc_driver_library => "/usr/share/logstash/mysql-connector-java-8.0.30.jar" # 其他JDBC配置... } }
方式B:Ruby脚本预加载Properties
若版本不支持上述语法,可通过Ruby过滤器提前加载文件内容:
# 在input前添加ruby初始化代码,加载全局变量 input { ruby { init => ' require "java" props = java.util.Properties.new file_stream = java.io.FileInputStream.new("/path/to/secrets.properties") props.load(file_stream) file_stream.close # 存储为全局变量,供后续配置使用 $db_pwd = props.getProperty("db_password") ' code => 'event.set("jdbc_pwd", $db_pwd)' } jdbc { jdbc_connection_string => "jdbc:mysql://db-host:3306/mydb" jdbc_user => "db_user" jdbc_password => "${jdbc_pwd}" # 其他JDBC配置... } }
方案3:通过JVM系统属性传递
将Properties中的键值对转为JVM启动参数,Logstash配置中通过${sys:...}引用系统属性。
- 编写启动脚本(例如
jvm-secrets.sh):
#!/bin/sh JVM_SECRETS="" while IFS='=' read -r key value; do if [[ ! $key =~ ^# && -n $key ]]; then JVM_SECRETS="$JVM_SECRETS -D$key=$value" fi done < /path/to/secrets.properties # 追加JVM参数并启动Logstash exec logstash "$@" --jvm.options "$JVM_SECRETS"
- 在Logstash配置中引用系统属性:
input { jdbc { jdbc_connection_string => "jdbc:mysql://db-host:3306/mydb" jdbc_user => "db_user" jdbc_password => "${sys:db_password}" # 其他JDBC配置... } }
内容的提问来源于stack exchange,提问作者C.Mahfoud
相关产品推荐
相关产品推荐

