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

Jac*_*ere 8 logging lxc docker

动机:通过计算特定数量的消息在特定时间范围内流过stdout来对docker容器运行基本运行状况检查

直接目标:从启动的shell中docker exec,读取正在从主进程传输到stdout的数据(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

我可以通过PID 1 以某种方式tail/ print/ read通过stdout传递消息吗?

我知道有一些工作 - 例如通过管道tee或以其他方式写入磁盘 - 但希望有一个神奇的子弹.

jan*_*nis 4

如果您同意,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"
Run Code Online (Sandbox Code Playgroud)
  • -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;"
Run Code Online (Sandbox Code Playgroud)

在此处阅读有关 Docker 的 seccomp 配置文件的更多信息(>1.10)。

测试用:

  • 视窗8.1
  • Docker 版本 1.10.2,内部版本 c3959b1
  • Docker-machine 版本 0.6.0,构建 e27fb87