logging - 是否可以从 Docker 容器中读取通过标准输出传递的消息? (没有 `docker logs` )

标签 logging docker lxc

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

直接目标:在由 docker exec 启动的 shell 中,读取从主进程(PID 1)通过管道传输到标准输出的数据

我什至不确定我想要的是否可能。如果是这种情况,我们将非常感谢您解释为什么不这样做——这将有助于增进我的知识。

重现步骤:

  1. 启动容器 -- container1 docker run -it --name container1 ubuntu bash -c -i "COUNT=0; while true; do echo 保持舞池节拍继续;((COUNT++)); sleep 1; echo\"Count is:\${COUNT }\“; 完毕;”

  2. 在另一个终端窗口中,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/

相关文章:

docker - 如何通过 SSH 连接到 Docker?

go - 使用 Docker 快速构建项目,无需 checkin vendor 库

docker - 如何在马拉松规范上设置 docker run 参数

bash - 启动容器进程导致 "exec:\"/bin/sh\": stat/bin/sh: no such file or directory": unknown

android - 我应该如何在 linux 容器 (lxc) 中运行 android?

logging - stackdriver 日志记录如何断言条目的严重性?

java - ehcache 和日志记录问题

python - 为什么我不能跟踪我的日志?

java - 建议非常快(微秒)的 java 日志记录?

networking - 如何以可以连接到互联网的方式启动具有静态 IP 地址的临时 lxc?