如何在Logstash管道执行完毕后关闭对应的Docker容器?
实现Logstash Docker容器处理完管道后自动关闭
要让Logstash处理完两个管道的任务后自动退出容器,核心是把Logstash从持续运行模式改成一次性批处理模式,具体步骤如下:
1. 调整两个管道的输入配置,让它们处理完数据后停止
MySQL查询管道(JDBC输入)
JDBC输入默认会按调度重复查询,要改成只执行一次并停止:
input { jdbc { jdbc_connection_string => "jdbc:mysql://your-mysql-host:3306/your_db" jdbc_user => "db_user" jdbc_password => "db_pass" jdbc_driver_library => "/usr/share/logstash/mysql-connector-java-8.0.30.jar" jdbc_driver_class => "com.mysql.cj.jdbc.Driver" # 设置一个永远不会重复的调度(仅执行一次) schedule => "0 0 0 0 0 ?" # 启用分页查询(适配大数据量场景) jdbc_paging_enabled => true statement => "SELECT * FROM your_target_table" # 查询完成后立即关闭数据库连接 close_connections => true } }
日志文件管道(File输入)
File输入默认会持续监听文件变化,要改成读完指定文件后停止:
input { file { path => "/path/to/your/logs/app.log" # 从文件开头开始读取 start_position => "beginning" # 禁用sincedb(避免记录读取位置,确保每次读完整文件) sincedb_path => "/dev/null" # 文件读完后立即关闭输入,不再等待新内容 close_older => 0 ignore_older => 0 # 缩短检查间隔,加快检测文件是否读完的速度 stat_interval => 1 discover_interval => 1 } }
2. 配置Logstash全局参数,确保所有管道完成后退出
在logstash.yml中添加以下配置,让Logstash在所有输入都关闭后自动退出:
# 启用Java执行引擎(提升性能,可选但推荐) pipeline.java_execution: true # 所有输入关闭后,等待指定时间(确保剩余事件处理完成)再退出 shutdown_timeout: 30
也可以在启动容器时通过环境变量传递这些参数,无需修改配置文件:
-e "LS_OPTS=--shutdown_timeout 30 --pipeline.java_execution true"
3. 启动Docker容器的正确命令
使用--rm参数,让容器在Logstash进程退出后自动删除,同时挂载你的配置目录和管道目录:
docker run --rm \ -v /host/path/to/logstash/config:/usr/share/logstash/config \ -v /host/path/to/logstash/pipeline:/usr/share/logstash/pipeline \ docker.elastic.co/logstash/logstash:8.11.3
4. 工作逻辑说明
- MySQL管道:执行一次查询,处理完所有返回的数据后关闭JDBC输入
- 日志文件管道:读完指定日志文件的全部内容后关闭File输入
- 当两个输入都关闭后,Logstash等待
shutdown_timeout秒(确保所有在处理中的事件都写入Elasticsearch),然后进程退出,Docker容器随之停止并被删除(因为使用了--rm参数)
内容的提问来源于stack exchange,提问作者barteloma
相关产品推荐
相关产品推荐

