2017-09-13 20 views
0

公正であるように、私がしたいのは、metricbeatがelasticsearchにsys statsを送り、それらをkibanaで見ることです。dockerコンテナの中にダメモンとしてlogstashを実行しています

私はelasticsearchドキュメントを読み、手がかりを見つけようとしています。 私の実際のアプリケーションはPythonで書かれているので、Pythonでイメージを作成しています。最終的な目標はすべてのログ(metricbeat経由のsys統計とfilebeat経由のappログ​​)を弾力的に送ることです。

logstashをコンテナ内のサービスとして実行する方法が見つからないようです。

私dockerfile:

FROM python:2.7 

WORKDIR /var/local/myapp 
COPY . /var/local/myapp 

# logstash 
RUN wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add - 
RUN apt-get update && apt-get install apt-transport-https dnsutils default-jre apt-utils -y 
RUN echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-5.x.list 
RUN apt-get update && apt-get install logstash 

# metricbeat 
#RUN wget https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-5.6.0-amd64.deb 
RUN dpkg -i metricbeat-5.6.0-amd64.deb 

RUN pip install --no-cache-dir -r requirements.txt 

RUN apt-get autoremove -y 

CMD bash strap_and_run.sh 

と、余分なスクリプトstrap_and_run.sh

python finalize_config.py 

# start 
echo "starting logstash..." 
systemctl start logstash.service 

#todo :get my_ip 
echo "starting metric beat..." 
/etc/init.d/metricbeat start 

finalize_config.py

import os 

import requests 

LOGSTASH_PIPELINE_FILE = 'logstash_pipeline.conf' 
LOGSTASH_TARGET_PATH = '/etc/logstach/conf.d' 

METRICBEAT_FILE = 'metricbeat.yml' 
METRICBEAT_TARGET_PATH = os.path.join(os.getcwd, '/metricbeat-5.6.0-amd64.deb') 

my_ip = requests.get("https://api.ipify.org/").content 

ELASTIC_HOST = os.environ.get('ELASTIC_HOST') 
ELASTIC_USER = os.environ.get('ELASTIC_USER') 
ELASTIC_PASSWORD = os.environ.get('ELASTIC_PASSWORD') 

if not os.path.exists(os.path.join(LOGSTASH_TARGET_PATH)): 
    os.makedirs(os.path.join(LOGSTASH_TARGET_PATH)) 

# read logstash template file 
with open(LOGSTASH_PIPELINE_FILE, 'r') as logstash_f: 
    lines = logstash_f.readlines() 
    new_lines = [] 
    for line in lines: 
     new_lines.append(line 
         .replace("<elastic_host>", ELASTIC_HOST) 
         .replace("<elastic_user>", ELASTIC_USER) 
         .replace("<elastic_password>", ELASTIC_PASSWORD)) 

# write current file 
with open(os.path.join(LOGSTASH_TARGET_PATH, LOGSTASH_PIPELINE_FILE), 'w+') as new_logstash_f: 
    new_logstash_f.writelines(new_lines) 

if not os.path.exists(os.path.join(METRICBEAT_TARGET_PATH)): 
    os.makedirs(os.path.join(METRICBEAT_TARGET_PATH)) 


# read metricbeath template file 
with open(METRICBEAT_FILE, 'r') as metric_f: 
    lines = metric_f.readlines() 

    new_lines = [] 
    for line in lines: 
     new_lines.append(line 
         .replace("<ip-field>", my_ip) 
         .replace("<type-field>", "test")) 

# write current file 
with open(os.path.join(METRICBEAT_TARGET_PATH, METRICBEAT_FILE), 'w+') as new_metric_f: 
    new_metric_f.writelines(new_lines) 

答えて

1

理由は、容器内部にはinitシステムがないです。したがって、serviceまたはsystemctlを使用しないでください。したがって、あなたはバックグラウンドでプロセスを開始する必要があります。あなたの更新されたスクリプトが

python finalize_config.py 

# start 
echo "starting logstash..." 
/usr/bin/logstash & 

#todo :get my_ip 
echo "starting metric beat..." 
/usr/bin/metric start & 

wait 

の下のようになります。また、TERMと他の信号のためのハンドリングを追加する必要があり、子プロセスをkillします。もしあなたがそうしなければ、docker stopにはほとんど問題がありません。私はメインのPIDとして1

+0

をsupervisordし、実行スーパーバイザーのようなプロセス・マネージャを使用してこのような状況で、あなたのポストを好む

はちょうどそれを行うdockerfileに私をリードしています。 https://github.com/jecklgamis/dockerfiles/blob/master/logstash/Dockerfile 完了したら最終設定を投稿します –

関連する問題