2016-01-22 17 views
9

私は 'docker logs'に表示したいログファイルに対して、/ dev/stdoutにリンクするシンボリックリンクのnginxメソッドを使用していますが、これは動作しません。マルチプロセスドッカーコンテナからのログ

シンボリックリンクが存在する(/ dev/stdoutを指している)場合は、(私が知る限り)何も書きませんが、削除すれば/ etc/crontabのシンプルなcronジョブでテストしましたシンボリックリンクとファイルに書き込みます。この作業は必要があります:私はは/ dev/stdoutをにエコーあれば、それは「ドッカログ」には見られないが

はまた、それは

質問...コマンドラインに戻ってecho'dされますか? (それはnginxで動作するようです)。そうでなければ、どのようにしてログを「セカンダリ」プロセスから取得してドッカーログに表示させるのでしょうか。このため、公式バグレポートを作成しhttps://github.com/nginxinc/docker-nginx/blob/a8b6da8425c4a41a5dedb1fb52e429232a55ad41/Dockerfile

nginxのDockerfileがシンボリックリンクの方法を示す:参照用

https://github.com/docker/docker/issues/19616

マイDockerfile:

FROM ubuntu:trusty 
#FROM quay.io/letsencrypt/letsencrypt:latest # For testing 

ENV v="Fri Jan 22 10:08:39 EST 2016" 

# Setup the cronjob 
ADD crontab /etc/crontab 
RUN chmod 600 /etc/crontab 

# Setup letsencrypt logs 
RUN ln -sf /dev/stdout /var/log/letsencrypt.log 
# Setup cron logs 
RUN ln -sf /dev/stdout /var/log/cron.log 
RUN ln -sf /dev/stdout /var/log/syslog 

# Setup keepalive script 
ADD keepalive.sh /usr/bin/keepalive.sh 
RUN chmod +x /usr/bin/keepalive.sh 

ENTRYPOINT /usr/bin/keepalive.sh 

crontabファイル:

* * * * * root date >> /var/log/letsencrypt.log 

keepalive.shスクリプト

#!/bin/bash 

# Start cron 
rsyslogd 
cron 

echo "Keepalive script running!" 

while true; do 

    echo 'Sleeping for an hour...' 
    sleep 10 

done 
+1

...あなたの質問は何ですか? – Sobrique

+0

Ha ...ありがとう、編集を参照してください! – geekscrap

+1

私はコンテナのログを管理することをあきらめて、代わりにlogstashを使ってelasticsearchにできるだけ多くを試してみてください。少しのセットアップオーバーヘッドがありますが、全体的にはそれほど痛みを伴いません。 – Sobrique

答えて

2

最終結果は、cronジョブの/ dev/stdoutが別のデバイスを指していたことです。

/proc/self/fd/1であったはずです。ドッカーは1つのプロセスだけがこれを実行することを期待しているため、モニターする唯一のstdoutです。

symlinkが/ proc/1/fd/1を指すように変更した後、apparmor(ホスト上)は実際にリクエストを拒否していました(/ proc/1/fd/1)。デフォルトのドッカープロファイル(自動的に生成されますが、 - security-optsで変更可能です)のためです。

アッパーアームのハードルを超えたら、それはすべて機能します!

これは、必要な要求を許可するためにapparmorで変更する必要があるものを見た後、以下のようにmkfifoメソッドを使用することに決めました。

Dockerfile

FROM ubuntu:latest 

ENV v="RAND-4123" 

# Run the wrapper script (to keep the container alive) 
ADD daemon.sh /usr/bin/daemon.sh 
RUN chmod +x /usr/bin/daemon.sh 

# Create the pseudo log file to point to stdout 
RUN mkfifo /var/log/stdout 
RUN mkfifo /var/log/stderr 

# Create a cronjob to echo into the logfile just created 
RUN echo '* * * * * root date 2>/var/log/stderr 1>/var/log/stdout' > /etc/crontab 

CMD "/usr/bin/daemon.sh" 

daemon.sh

#!/bin/bash 

# Start cron 
cron 

tail -qf --follow=name --retry /var/log/stdout /var/log/stderr 
3

まあ、それはコメントで言及されましたが、参考のために - 私はdockerログへの最善の解決策は、一般的に「標準」のマルチシステムロギングメカニズムに依存している見つけます - 具体的にはsyslogである。

これは、ホスト上で組み込みのsyslogdを使用するか、syslogdとしてlogstashを使用できるためです。それは作り付けのフィルタを持っていますが、実際には十分な柔軟性があることではないから少し苦しむ傾向があるので、代わりに私はTCP/UDPリスナーを使用して、明示的にログを解析 - "When logstash and syslog goes wrong"

input { 
    tcp { 
    port => 514 
    type => syslog 
    } 
    udp { 
    port => 514 
    type => syslog 
    } 
} 

そして、フィルタに概説されているようログ:

filter { 
    if [type] == "syslog" { 
    grok { 
     match => { "message" => "<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" } 
    } 
    syslog_pri { } 
    } 
} 

はその後、elasticsearchするには、このlogstashを養うことができます - のいずれかのリモートホスト、ローカルコンテナまたは私が今やっている上elasticsearchインスタンスマルチノードとdocker networkです。 (私はダウンロードとドッカーファイルを使用して自分自身をロールバックしましたが、スタンドアロンのコンテナも存在すると確信しています)。

output { 
    elasticsearch { 
     hosts => [ "es-tgt" ] 
    } 
} 

ここでの利点がある - ドッキングウィンドウはあなたがちょうどlogstashの設定が正しい場所を指すように別名設定できて、あなたのelasticsearchコンテナの名前を指定する--linkまたは--netを使用するかすることができます。あなたは(私はetcdを使用しますが、他のオプションを使用できます)キーと値のストアを設定する必要があるという点で、(例えばdocker run -d --link my_es_container_name:es-tgt -p 514:514 -p 514:514/udp mylogstashまたは単にdocker run --net es_net ....

docker networkセットアップは、もう少し複雑です。あるいは、あなたはKubernetesのようなことをすることができます。

kibanaを使用して可視化します。もう一度キバナポートを公開しますが、elasticsearchネットワークに転送してクラスタと通信します。

ただし、これがセットアップされたら、nginxlog to syslogなどの設定と、ログ記録の結果を定期的に取得することができます。本当のメリットは、ロギングに単一のサービスを使用していることです.1つのサービスは、必要に応じて(ネットワーク/コンテナ化のおかげで)拡張できます。

+0

ありがとうございますが、私は/ dev/stdoutへのログ記録の主な問題を解決する答えを実際に出していました。 私は今それを持っているかもしれないと思う、ちょうどそれをテストする – geekscrap

+0

それはいいです。あなたはコメントの中でそれを参照するだけなので、私はチップを入れると思った。 – Sobrique

関連する問題