动机:通过计算一定数量的消息在特定时间范围内跨stdout流动,以在docker容器上运行基本的健康检查
直接目标:从docker exec
开始的外壳内,读取正在管道的数据以从主过程(PID 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;"
-
在另一个终端窗口中,
docker exec
在同一容器中启动另一个过程docker exec -it container1 bash
我可以以某种方式tail
/print
/read
PID 1上传递的消息?
我知道有一些工作 - 例如通过tee
管道或以其他方式写入磁盘 - 但希望有魔术子弹。
如果您可以使用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的Syscall安全策略,例如通过在启动容器时将--security-opt seccomp:unconfined
添加到docker 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;"
在此处阅读有关Docker的Seccomp配置文件的更多信息(> 1.10)。
测试:
- Windows 8.1
- Docker版本1.10.2,构建C3959B1
- Docker-Machine版本0.6.0,构建E27FB87