Запуск Docker в качестве назначения syslog-ng завершается ошибкой

У меня есть созданная Vagrant виртуальная машина, работающая под управлением Ubuntu Trusty 64, с выделенным для нее одним хост-процессором. Внутри этой виртуальной машины у меня есть образ Docker со стандартным 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, он будет отправлен на стандартный вывод, как и ожидалось.

У меня также установлен 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% ЦП виртуальной машины и 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 использует 20% своего ЦП, но 100% хоста, он ограничен вводом-выводом, и виртуальная машина работает очень усердно, чтобы не отставать. С этой целью я попытался использовать и сбрасывать stdin и stdout в сценарии Python, но, насколько я могу судить, поскольку он даже не создает контейнер, он не доходит до сценария.

Итак, моей следующей мыслью было, что должна быть какая-то комбинация флагов докера -a, -d, -i и -t, которую я не пробовал, но я уверен, что пробовал все допустимые комбинации безрезультатно.

Что я пропустил?


person MerseyViking    schedule 10.03.2015    source источник


Ответы (1)


Если вы запускаете syslog-ng на переднем плане (syslog-ng-binary -Fedv), вы видите, что syslog-ng запускает и останавливает назначение программы в цикле, это приводит к 100%-ному вращению процессора. Но после локального исследования проблемы вы должны использовать назначение программы как (без '): program("sudo docker run -i -v /scripts:/scripts python-test /scripts/test.py");

Бр, Мичек

person András Mitzki    schedule 10.03.2015
comment
Это исправлено - я не могу поверить, что это были просто дополнительные одинарные кавычки. Я даже не уверен, откуда они взялись - должно быть, я добавил их в какой-то момент по какой-то причине и никогда не удалял. Спасибо Мичек. - person MerseyViking; 10.03.2015