2016-12-24 15 views
6

动机:要通过计算一定数量的消息运行一个码头工人容器基本的健康检查跨越标准输出流过一定的时间范围是否可以从Docker容器中读取通过stdout传递的消息? (不`泊坞窗logs`)

近期目标:从在由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通过stdout传递的消息?

我知道有一些解决方法 - 例如通过tee管道或以其他方式写入磁盘 - 但希望有一个神奇的子弹。

+0

也许这? http://stackoverflow.com/a/17790708/2079781 – Rickkwa

+0

感谢您的建议,但我无法得到解决方案来处理上面提供的复制。 – JacobWuzHere

+0

我没有找到快速解决方案,但您可以查看https:// github。com/gliderlabs/logspout,它以某种方式获取容器的日志输出,并且通常将其输出到远程收集器。 (编辑:嗯,我认为这也可以通过Docker主机,所以它可能不是你要找的) – schmunk

回答

2

如果你是strace OK那就试试这个:

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是有缩小输出到标准输出(-e write=1,2将显示标准输出和STDERR)

根据Docker版本的不同,您可能需要放松Docker的系统调用安全策略,例如通过完全禁用它通过启动容器时加入--security-opt seccomp:unconfineddocker 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 here(> 1.10)。

测试了:

  • 的Windows 8.1
  • 泊坞版本1.10.2,构建c3959b1
  • 泊坞窗机版本0.6.0,建立e27fb87