动机:通过计算一定数量的消息在特定时间范围内流经标准输出,对 docker 容器运行基本健康检查
直接目标:在由 docker exec
启动的 shell 中,读取从主进程(PID 1)通过管道传输到标准输出的数据
我什至不确定我想要的是否可能。如果是这种情况,我们将非常感谢您解释为什么不这样做——这将有助于增进我的知识。
重现步骤:
启动容器 --
container1
docker run -it --name container1 ubuntu bash -c -i "COUNT=0; while true; do echo 保持舞池节拍继续;((COUNT++)); sleep 1; echo\"Count is:\${COUNT }\“; 完毕;”
在另一个终端窗口中,
docker exec
在同一个容器中启动另一个进程docker exec -it container1 bash
我能否以某种方式 tail
/print
/read
PID 1 通过标准输出传递的消息?
我知道有一些变通方法——例如通过 tee
管道或以其他方式写入磁盘——但希望能有 Elixir 。
最佳答案
如果你对 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
添加到 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 配置文件 here (>1.10)。
测试:
- Windows 8.1
- Docker 版本 1.10.2,构建 c3959b1
- Docker 机器版本 0.6.0,构建 e27fb87
关于logging - 是否可以从 Docker 容器中读取通过标准输出传递的消息? (没有 `docker logs` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309692/