2016-12-24 13 views
6

Động lực: Để chạy một kiểm tra sức khoẻ cơ bản về một container Docker bằng cách đếm rằng một số lượng nhất định các thông điệp chảy qua stdout trong một thời gian nhất định chân trờiCó thể đọc tin nhắn được truyền qua thiết bị xuất chuẩn từ trong vùng chứa Docker không? (Không có 'Docker logs`)

mục tiêu trước mắt: Từ bên trong một trình bao bắt đầu bằng docker exec, đọc dữ liệu đang được truyền tới đường ra khỏi quá trình chính (PID 1)

Tôi thậm chí không chắc chắn nếu những gì tôi muốn là có thể. Nếu đúng như vậy, giải thích tại sao không được đánh giá cao lắm - và sẽ giúp nâng cao kiến ​​thức của tôi.

bước để tái sản xuất:

  1. Bắt đầu container - 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. Trong một cửa sổ terminal, docker exec để bắt đầu quá trình khác trong cùng một thùng chứa docker exec -it container1 bash

Tôi có thể bằng cách nào đó không?/print/read các thư được truyền qua stdout bởi PID 1?

Tôi hiểu rằng có các công việc xung quanh - ví dụ: đường ống qua tee hoặc viết khác vào đĩa - nhưng hy vọng sẽ có một viên đạn ma thuật.

+0

Có lẽ điều này? http://stackoverflow.com/a/17790708/2079781 – Rickkwa

+0

Cảm ơn bạn đã gợi ý, nhưng tôi không thể có được giải pháp đó để làm việc với bản sao tôi đã cung cấp ở trên. – JacobWuzHere

+0

Tôi không tìm thấy giải pháp nhanh, nhưng bạn có thể xem https: // github.com/gliderlabs/logspout lấy đầu ra bản ghi của một vùng chứa "bằng cách nào đó" và thường dẫn nó tới một bộ thu từ xa. (chỉnh sửa: hmm, tôi nghĩ rằng điều này cũng hoạt động thông qua Docker-host, vì vậy nó có thể không phải là những gì bạn đang tìm kiếm) – schmunk

Trả lời

2

Nếu bạn là OK với strace sau đó thử này:

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 là PID
  • -e write=1 đang có để thu hẹp đầu ra STDOUT (-e write=1,2 sẽ hiển thị cả stdout và stderr)

Tùy thuộc vào phiên bản Docker bạn có thể cần phải nới lỏng chính sách bảo mật syscall của Docker, ví dụ: bằng cách tắt nó hoàn toàn bằng cách thêm --security-opt seccomp:unconfined-docker run khi khởi container:

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;" 

Đọc thêm về seccomp của Docker tiểu here (> 1.10).

Thử nghiệm với:

  • Windows 8.1
  • Docker phiên bản 1.10.2, xây dựng c3959b1
  • Docker máy phiên bản 0.6.0, xây dựng e27fb87
Các vấn đề liên quan