是否有可能从Docker容器中读取通过stdout传递的消息? (没有`docker日志`)
动机:通过计算一定数量的消息在一定时间范围内通过标准输出来运行Docker容器上的基本运行状况检查
即时目标:从docker exec
启动的shell中,读取从主进程(PID 1)输出到stdout的数据,
我甚至不确定我想要什么是可能的。 如果是这样的话,解释为什么不会很感激 – 并有助于提高我的知识。
重现步骤:
-
启动容器 –
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;"
-
在另一个terminal窗口中,
docker exec
在同一个容器docker exec -it container1 bash
启动另一个进程
我可以以某种方式tail
/ print
/ read
由PID 1通过标准输出传递的消息吗?
我知道有一些解决方法 – 例如通过tee
pipe道或者以其他方式写入磁盘 – 但希望获得一个神奇的子弹。
如果你确定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