来自多个Docker容器的尾部标准输出

时间:2016-06-29 08:53:52

标签: docker docker-compose

我有一个在后台模式下启动10个容器的脚本(图-d选项)。我想从所有这些中聚合stdout或登录/ var / log。我怎样才能做到这一点?

使用不同的docker-compose文件启动容器,所以我不能做docker-compose up target1 target2 target3

docker logs只接受一个容器作为参数。

我正在考虑在所有容器上从/ var / log创建一个卷,将它们映射到docker之外的目录,确保日志没有碰撞名称,而不是使用bash tail -f *。但我希望有一个更优雅的解决方案

2 个答案:

答案 0 :(得分:6)

此bash脚本将执行您想要的操作:

<强>搬运工-日志

#!/bin/bash

if [ $# -eq 0 ]; then
   echo "Usage: $(basename "$0") containerid ..."
   exit 1
fi

pids=()
cleanup()
{
   kill "${pids[@]}"
}

trap cleanup EXIT

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

<强>用法:

$ docker-logs containerid1 containerid2 ... containeridN

此脚本的输出包含跟踪日志的每一行,前面带有容器ID。

该脚本以--follow模式运行,必须使用 Ctrl-C 中断。

请注意,docker logs的选项在脚本中是硬编码的。如果您需要能够从命令行控制docker logs的选项,则需要解析命令行参数(例如,使用getopts)。

答案 1 :(得分: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

我使用的是docker swarm模式,附带1.12并部署了许多复制。因此,我的所有容器都包含与服务名称相同的常用文本。要在docker节点中拖动所有日志,我在每个docker节点上使用它。 filter-text将仅过滤我的容器。

如果你想停止拖尾,这对我有用;

pkill -f 'docker logs'