运行 Docker 作为 syslog-ng 目标失败
Running Docker as a syslog-ng destination fails
我有一个 Vagrant 创建的 VM 运行ning stock Ubuntu Trusty 64,分配了一台主机 CPU。
在那个 VM 中,我有一个 Docker 图像 运行ning stock Python 3.4.3:
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 脚本,它会按预期发送到标准输出。
我还在该 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 消耗了虚拟机 CPU 的大约 20%,以及主机 CPU 的 100%,而且容器永远不会被创建(运行ning 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
标志的组合没试过,但我确定我已经尝试了所有允许的组合都无济于事。
我错过了什么?
如果您在前台启动 syslog-ng (syslog-ng-binary -Fedv),您会看到 syslog-ng 在循环中启动和停止程序目标,这会导致 100% CPU 旋转。
但是在本地调查问题后,您应该使用程序目标作为(不带'):
程序("sudo docker run -i -v /scripts:/scripts python-test /scripts/test.py");
Br,
米切克
我有一个 Vagrant 创建的 VM 运行ning stock Ubuntu Trusty 64,分配了一台主机 CPU。 在那个 VM 中,我有一个 Docker 图像 运行ning stock Python 3.4.3:
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 脚本,它会按预期发送到标准输出。
我还在该 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 消耗了虚拟机 CPU 的大约 20%,以及主机 CPU 的 100%,而且容器永远不会被创建(运行ning 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
标志的组合没试过,但我确定我已经尝试了所有允许的组合都无济于事。
我错过了什么?
如果您在前台启动 syslog-ng (syslog-ng-binary -Fedv),您会看到 syslog-ng 在循环中启动和停止程序目标,这会导致 100% CPU 旋转。 但是在本地调查问题后,您应该使用程序目标作为(不带'): 程序("sudo docker run -i -v /scripts:/scripts python-test /scripts/test.py");
Br, 米切克