【问题标题】:Is it possible to read messages passed over stdout from within a Docker container? (without `docker logs`)是否可以从 Docker 容器中读取通过标准输出传递的消息? (没有`docker日志`)
【发布时间】:2016-12-24 02:04:45
【问题描述】:

动机:通过计算一定数量的消息在特定时间范围内流经标准输出,对 docker 容器运行基本健康检查

直接目标:在由docker exec 启动的shell 中,读取从主进程(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 进行管道传输或以其他方式写入磁盘——但我希望能有灵丹妙药。

【问题讨论】:

  • 感谢您的建议,但我无法让该解决方案与我上面提供的复制一起使用。
  • 我没有找到快速的解决方案,但您可以查看github.com/gliderlabs/logspout,它“以某种方式”抓取容器的日志输出,通常将其通过管道传输到远程收集器。 (编辑:嗯,我认为这也可以通过 Docker 主机工作,所以它可能不是你想要的)
  • 为什么tee 不是一个有效的灵丹妙药?未修改的入口点对您来说是有效解决方案的要求吗?它是否需要在不添加任何额外功能的情况下在容器内工作?如果是这样,您可能正在寻找 unobtanium。

标签: logging docker lxc


【解决方案1】:

如果你对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

【讨论】:

    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 2020-09-24
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多