Можно ли читать сообщения, передаваемые через стандартный вывод, из контейнера Docker? (без логов докера)

Мотивация: выполнить базовую проверку работоспособности контейнера Docker, подсчитав, что определенное количество сообщений проходит через стандартный вывод за определенный период времени.

Ближайшая цель: из оболочки, запущенной docker exec, прочитать данные, которые передаются на стандартный вывод из основного процесса (PID 1).

Я даже не уверен, что то, что я хочу, возможно. Если это так, объяснение того, почему нет, было бы очень признательно и помогло бы расширить мои знания.

Действия по воспроизведению:

  1. Запустите контейнер -- container1 docker run -it --name container1 ubuntu bash -c -i "COUNT=0; while true; do echo Keep the dance floor beat going; ((COUNT++)); sleep 1; echo \"Count is: \${COUNT}\"; done;"

  2. В другом окне терминала docker exec запустить другой процесс в том же контейнере docker exec -it container1 bash

Могу ли я каким-то образом tail/print/read сообщения, передаваемые через стандартный вывод с помощью PID 1?

Я понимаю, что есть обходные пути — например, передача по конвейеру через tee или иная запись на диск — но надеялся на волшебную палочку.


person JacobWuzHere    schedule 24.12.2016    source источник
comment
Может быть, это? stackoverflow.com/a/17790708/2079781   -  person Rickkwa    schedule 24.12.2016
comment
Спасибо за предложение, но мне не удалось заставить это решение работать с репликацией, которую я предоставил выше.   -  person JacobWuzHere    schedule 28.12.2016
comment
Я не нашел быстрого решения, но вы можете взглянуть на github.com/gliderlabs/logspout. который каким-то образом захватывает вывод журнала контейнера и обычно передает его удаленному сборщику. (редактировать: хм, я думаю, что это также работает через Docker-хост, так что это может быть не то, что вы ищете)   -  person schmunk    schedule 29.12.2016
comment
Почему tee не является действенной волшебной палочкой? Является ли немодифицированная точка входа требованием для действительного решения? Должен ли он работать внутри контейнера без добавления каких-либо дополнительных возможностей? Если да, возможно, вы ищете анобтаниум.   -  person BMitch    schedule 29.12.2016


Ответы (1)


Если у вас все в порядке с strace, попробуйте следующее:

docker exec -it container1 bash -c -i "\
    apt-get update && apt-get install strace && \
    strace -ff -e trace=write -e write=1 -p 1"
  • -p 1 — это PID
  • -e write=1 предназначен для сужения вывода до STDOUT (-e write=1,2 будет отображать как STDOUT, так и STDERR)

В зависимости от версии Docker вам может потребоваться ослабить политику безопасности системных вызовов Docker, например. полностью отключив его, добавив --security-opt seccomp:unconfined к docker run при запуске контейнера:

docker run --security-opt seccomp:unconfined -it --name container1 ubuntu bash -c -i "COUNT=0; while true; do echo Keep the dance floor beat going; ((COUNT++)); sleep 5; ech o \"Count is: \${COUNT}\"; done;"

Подробнее о профилях seccomp Docker читайте здесь ( >1,10).

Протестировано с:

  • Windows 8.1
  • Докер версии 1.10.2, сборка c3959b1
  • Докер-машина версии 0.6.0, сборка e27fb87
person jannis    schedule 29.12.2016