是否可以从Docker容器中读取通过Stdout传递的消息?(没有“ docker logs”)



动机:通过计算一定数量的消息在特定时间范围内跨stdout流动,以在docker容器上运行基本的健康检查

直接目标: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上传递的消息?

我知道有一些工作 - 例如通过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

最新更新