我有一个在后台模式下启动10个容器的脚本(图-d选项)。我想从所有这些中聚合stdout或登录/ var / log。我怎样才能做到这一点?
使用不同的docker-compose文件启动容器,所以我不能做docker-compose up target1 target2 target3
docker logs只接受一个容器作为参数。
我正在考虑在所有容器上从/ var / log创建一个卷,将它们映射到docker之外的目录,确保日志没有碰撞名称,而不是使用bash tail -f *。但我希望有一个更优雅的解决方案
答案 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'