2016-12-24 30 views
6

Motywacja: Aby uruchomić podstawowy health-check na pojemniku Döcker zliczając że pewnej liczby wiadomości przepływać przez stdout w określonym horyzoncie czasowymCzy można odczytać wiadomości przekazywane przez standardowe wyjście z kontenera Docker? (Bez `logs` doker)

Bezpośrednim celem: Z w powłoce uruchamianej przez docker exec odczytane dane przesyłane do stdout z głównego procesu (PID 1)

Nie jestem nawet pewien, czy to, co chcę, jest możliwe. Jeśli tak jest, wyjaśnienie, dlaczego nie byłoby bardzo cenne - i pomogłoby pogłębić moją wiedzę.

Kroki do odtworzenia:

  1. Uruchom 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. W innym oknie terminala docker exec aby rozpocząć kolejny proces w tym samym pojemniku docker exec -it container1 bash

Czy mogę jakoś tail/print/read wiadomości przekazywane przez standardowe wyjście PID 1?

Rozumiem, że istnieją prace dookoła - na przykład przepuszczanie przez tee lub w inny sposób zapisywanie na dysku - ale liczyłem na magiczną kulę.

+0

Może to? http://stackoverflow.com/a/17790708/2079781 – Rickkwa

+0

Dzięki za sugestię, ale nie udało mi się uzyskać tego rozwiązania do pracy z replikacją podaną powyżej. – JacobWuzHere

+0

Nie znalazłem szybkiego rozwiązania, ale możesz rzucić okiem na https: // github.com/gliderlabs/logspout, które "wychwytuje" dane wyjściowe dziennika kontenera i zwykle kieruje je do zdalnego kolektora. (edytuj: hmm, myślę, że działa to również za pośrednictwem hosta Docker, więc może nie być tym, czego szukasz) – schmunk

Odpowiedz

2

Jeśli jesteś OK z strace następnie spróbuj tego:

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 jest PID
  • -e write=1 jest tam wąskie wyjście na stdout (-e write=1,2 pokaże zarówno STDOUT i stderr)

W zależności od wersji Dockera może być konieczne poluzowanie zabezpieczeń systemu Docker, np. wyłączając go całkowicie dodając --security-opt seccomp:unconfined do docker run podczas uruchamiania pojemnika:

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

Więcej o Seccomp oknie dokowanym za profile here (> 1,10).

Testowane z:

  • systemu Windows 8.1
  • Docker wersji 1.10.2, budować c3959b1
  • Docker automatyczna wersja 0.6.0, budować e27fb87