是否有可能从Docker容器中读取通过stdout传递的消息? (没有`docker日志`)

动机:通过计算一定数量的消息在一定时间范围内通过标准输出来运行Docker容器上的基本运行状况检查

即时目标:docker exec启动的shell中,读取从主进程(PID 1)输出到stdout的数据,

我甚至不确定我想要什么是可能的。 如果是这样的话,解释为什么不会很感激 – 并有助于提高我的知识。

重现步骤:

  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. 在另一个terminal窗口中, docker exec在同一个容器docker exec -it container1 bash启动另一个进程

我可以以某种方式tail / print / read由PID 1通过标准输出传递的消息吗?

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

如果你确定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添加到--security-opt seccomp:unconfined来完全禁用它:

 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;" 

在这里阅读更多关于Docker的seccompconfiguration文件(> 1.10)。

经testing:

  • Windows 8.1
  • Docker版本1.10.2,构buildc3959b1
  • Docker-machine版本0.6.0,build e27fb87