Vagrant で作成された VM でストック Ubuntu Trusty 64 を実行しており、1 つのホスト CPU が割り当てられています。その VM 内に、ストック Python 3.4.3 を実行する Docker イメージがあります。
FROM python:3.4.3-slim
ENTRYPOINT ["/usr/local/bin/python"]
任意の Python スクリプトを実行すると:
import time
while True:
time.sleep(1)
このような:
sudo docker run -i -v /etc/alloy_listener/scripts:/scripts:ro alloy_listener /scripts/test.py
すべて問題なく、コンテナは実行され、ほとんど何もせずにそこに座っています。Python スクリプトに print ステートメントを追加すると、予想どおり stdout に送信されます。
その VM には syslog-ng もインストールされています。私の意図は、コンテナー化された Python を使用して syslog-ng の宛先として機能させることです。
source s_foo {
unix-stream("/dev/log");
};
destination d_foo {
program("'docker run -i -v /etc/alloy_listener/scripts:/scripts:ro alloy_listener /scripts/test.py'");
};
log {
source(s_foo);
destination(d_foo);
};
しかし、構成をリロードすると、syslog-ng は VM の CPU の約 20% とホストの CPU の 100% を消費し、コンテナーは作成されません (実行してもコンテナーは生成されsudo docker ps -a
ません)。実行sudo syslog-ng-ctl stats
すると、プログラムを実行しようとしていることがわかります。
dst.program;d_foo#0;'docker run -i -v /etc/alloy_listener/scripts:/scripts:ro alloy_listener /scripts/test.py';a;dropped;0
dst.program;d_foo#0;'docker run -i -v /etc/alloy_listener/scripts:/scripts:ro alloy_listener /scripts/test.py';a;processed;2
dst.program;d_foo#0;'docker run -i -v /etc/alloy_listener/scripts:/scripts:ro alloy_listener /scripts/test.py';a;stored;0
私の感覚では、syslog-ng は CPU の 20% を使用していますが、ホストの 100% を使用しているため、I/O バウンドであり、VM は追いつくために非常に懸命に働いています。そのために、Pythonスクリプトでstdinとstdoutを消費してフラッシュしようとしましたが、コンテナを作成していないため、スクリプトまで到達していません。
だから私の次の考えは、私が試していないdocker の-a
、-d
、-i
、およびフラグの組み合わせがあるに違いないということでしたが、許容されるすべての組み合わせを試しても無駄だったと確信しています。-t
私は何を逃したのですか?