将Docker作为syslog-ng目标运行失败

时间:2015-03-10 00:22:17

标签: python docker syslog-ng

我有一个Vagrant创建的VM运行库存Ubuntu Trusty 64,其中分配了一个主机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

一切都很好,容器运行,只是坐在那里做很少。如果我将print语句添加到Python脚本中,它会按预期发送到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消耗大约20%的VM的CPU和100%的主机CPU,并且容器永远不会被创建(运行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使用了20%的CPU,但是100%的主机,它的I / O受限,并且VM正在努力工作以保持最佳状态。为此,我尝试在Python脚本中使用和刷新stdin和stdout,但据我所知,因为它甚至没有创建容器,所以它没有达到脚本的程度。

所以我的下一个想法是必须有一些码头工具-a-d-i-t标志的组合,我没试过,但我'我确定我已经尝试了所有允许的组合无济于事。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

如果在前台启动syslog-ng(syslog-ng-binary -Fedv),您会看到syslog-ng在循环中启动和停止程序目标,这会导致100%CPU spining。 但在本地调查问题后,您应该使用程序目的地(没有'): 程序(" sudo docker run -i -v / scripts:/ scripts python-test /scripts/test.py");

BR, Micek