2016-06-29 4 views
4

У меня есть сценарий, который запускает 10 контейнеров в фоновом режиме (рис. -d). Я хочу объединить stdout или log/var/log из всех них. Как я могу это сделать?Tail stdout из нескольких контейнеров Docker

Контейнеры начали использовать различные Докер-сочинять файлы, так что я не могу сделать докер-компоновать до Target1 target2 target3

журналы Docker принимает только один контейнер в качестве параметра.

Я рассматривал возможность создания тома из/var/log на всех контейнерах, сопоставления их с каталогом вне докеров, следя за тем, чтобы журналы не имели встречного имени и не использовали bash tail -f *. Но я хотел бы получить более элегантное решение

ответ

4

Этот Баш скрипт будет делать то, что вы хотите:

докер-журналы

#!/bin/bash 

while [ $# -ne 0 ] 
do 
    (docker logs -f -t --tail=10 $1|sed -e "s/^/$1: /")& 
    shift 
done 
wait 

Использование:

$ docker-logs containerid1 containerid2 ... containeridN 

Выход этого сценария имеет каждую строку из отслеживаемых журналов, добавленных с идентификатором контейнера.

Сценарий работает в --follow режиме и должен быть прерван Ctrl-C.

Обратите внимание, что параметры docker logs жестко закодированы в сценарии. Если вам нужно иметь возможность управлять параметрами docker logs из командной строки, вам необходимо проанализировать аргументы командной строки (например, с помощью getopts).

0

Docker не поддерживает пока 1.12. Но у меня есть обходное решение через bash;

docker ps | grep -w <filter-text> | for i in `awk '{ print $1 }'`; do docker logs -f --tail=30 $i & done 

Я использую режимы плавания докеров, поставляется с 1.12 и развертывается много репликации. Таким образом, все мои контейнеры содержат общий текст, который совпадает с именем службы. Чтобы перехватить все свои журналы в докерном узле, я использую это на каждом докере. filter-text будет фильтровать только мои контейнеры.

Если вы хотите остановить хвостохранилище, это работает для меня;

pkill -f 'docker logs' 
Смежные вопросы