2016-12-24 39 views
6

動機:要通過計算一定數量的消息運行一個碼頭工人容器基本的健康檢查跨越標準輸出流過一定的時間範圍是否可以從Docker容器中讀取通過stdout傳遞的消息? (不`泊塢窗logs`)

近期目標:從在由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通過stdout傳遞的消息?

我知道有一些解決方法 - 例如通過tee管道或以其他方式寫入磁盤 - 但希望有一個神奇的子彈。

+0

也許這? http://stackoverflow.com/a/17790708/2079781 – Rickkwa

+0

感謝您的建議,但我無法得到解決方案來處理上面提供的複製。 – JacobWuzHere

+0

我沒有找到快速解決方案,但您可以查看https:// github。com/gliderlabs/logspout,它以某種方式獲取容器的日誌輸出,並且通常將其輸出到遠程收集器。 (編輯:嗯,我認爲這也可以通過Docker主機,所以它可能不是你要找的) – schmunk

回答

2

如果你是strace OK那就試試這個:

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是有縮小輸出到標準輸出(-e write=1,2將顯示標準輸出和STDERR)

根據Docker版本的不同,您可能需要放鬆Docker的系統調用安全策略,例如通過完全禁用它通過啓動容器時加入--security-opt seccomp:unconfineddocker 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;" 

瞭解更多關於泊塢窗的型材的Seccomp here(> 1.10)。

測試了:

  • 的Windows 8.1
  • 泊塢版本1.10.2,構建c3959b1
  • 泊塢窗機版本0.6.0,建立e27fb87