2016-01-22 23 views
9

Tôi đang sử dụng phương pháp nginx của liên kết tượng trưng liên kết đến/dev/stdout cho bất kỳ tệp nhật ký nào mà tôi muốn xuất hiện trong 'nhật ký docker', tuy nhiên điều này không hoạt động.Đăng nhập từ các bộ chứa docker đa xử lý

Tôi đã thử nghiệm điều này với một cronjob đơn giản trong/etc/crontab, nếu có một liên kết tượng trưng (trỏ tới/dev/stdout) nó không viết bất cứ thứ gì (theo như tôi có thể biết), nhưng nếu tôi xóa các liên kết tượng trưng và nó ghi vào tập tin.

Ngoài ra nếu tôi vang vào/dev/stdout nó được echo'd lại trên dòng lệnh tuy nhiên nó không được tìm thấy trong 'bản ghi Docker ...

Câu hỏi: Có nên làm việc này? (Nó dường như làm việc với nginx). Khác, làm cách nào để nhận nhật ký từ các quy trình 'phụ' xuất hiện trong nhật ký docker.

Đối với ref:

Nginx Dockerfile cho thấy phương pháp liên kết tượng trưng: https://github.com/nginxinc/docker-nginx/blob/a8b6da8425c4a41a5dedb1fb52e429232a55ad41/Dockerfile

Tạo một báo cáo lỗi chính thức cho việc này: https://github.com/docker/docker/issues/19616

My Dockerfile:

FROM ubuntu:trusty 
#FROM quay.io/letsencrypt/letsencrypt:latest # For testing 

ENV v="Fri Jan 22 10:08:39 EST 2016" 

# Setup the cronjob 
ADD crontab /etc/crontab 
RUN chmod 600 /etc/crontab 

# Setup letsencrypt logs 
RUN ln -sf /dev/stdout /var/log/letsencrypt.log 
# Setup cron logs 
RUN ln -sf /dev/stdout /var/log/cron.log 
RUN ln -sf /dev/stdout /var/log/syslog 

# Setup keepalive script 
ADD keepalive.sh /usr/bin/keepalive.sh 
RUN chmod +x /usr/bin/keepalive.sh 

ENTRYPOINT /usr/bin/keepalive.sh 

Các tập tin crontab:

* * * * * root date >> /var/log/letsencrypt.log 

keepalive.sh kịch bản

#!/bin/bash 

# Start cron 
rsyslogd 
cron 

echo "Keepalive script running!" 

while true; do 

    echo 'Sleeping for an hour...' 
    sleep 10 

done 
+1

... câu hỏi của bạn là gì? – Sobrique

+0

Ha ... Cảm ơn vì điều đó, hãy xem bản chỉnh sửa! – geekscrap

+1

Tôi đã từ bỏ việc quản lý nhật ký trong các vùng chứa và thay vào đó hãy thử và nạp nhiều nhất có thể thông qua logstash để elasticsearch. Trong khi có một chút chi phí thiết lập, nó ít đau đớn tổng thể. – Sobrique

Trả lời

2

Kết quả cuối cùng là/dev/stdout cho công việc cron đã được trỏ đến thiết bị khác.

/proc/self/fd/1 và lẽ ra phải là/proc/1/fd/1 vì docker chỉ hy vọng một quy trình để chạy này là thiết bị duy nhất mà màn hình giám sát.

Vì vậy, một khi tôi đã sửa đổi các liên kết đến điểm/proc/1/fd/1, nó đã hoạt động tuy nhiên apparmor (trên máy chủ) thực sự đã từ chối các yêu cầu (và nhận các lỗi quyền khi lặp lại/proc/1)/fd/1) vì hồ sơ docker mặc định (được tạo tự động nhưng có thể được sửa đổi với --security-opts).

Sau khi vượt qua rào cản của ứng dụng, tất cả đều hoạt động!

Điều này cho biết, sau khi xem xét những gì cần thiết để được sửa đổi trong apparmor để cho phép yêu cầu yêu cầu tôi quyết định sử dụng phương pháp mkfifo như hiển thị dưới đây.

Dockerfile

FROM ubuntu:latest 

ENV v="RAND-4123" 

# Run the wrapper script (to keep the container alive) 
ADD daemon.sh /usr/bin/daemon.sh 
RUN chmod +x /usr/bin/daemon.sh 

# Create the pseudo log file to point to stdout 
RUN mkfifo /var/log/stdout 
RUN mkfifo /var/log/stderr 

# Create a cronjob to echo into the logfile just created 
RUN echo '* * * * * root date 2>/var/log/stderr 1>/var/log/stdout' > /etc/crontab 

CMD "/usr/bin/daemon.sh" 

daemon.sh

#!/bin/bash 

# Start cron 
cron 

tail -qf --follow=name --retry /var/log/stdout /var/log/stderr 
3

Vâng, nó đã được đề cập trong các ý kiến, nhưng để tham khảo - Tôi tìm ra giải pháp tốt nhất để docker khai thác gỗ thường dựa vào các cơ chế khai thác gỗ 'tiêu chuẩn' đa hệ thống - cụ thể là syslog càng nhiều càng tốt.

Điều này là do bạn có thể sử dụng syslogd sẵn có trên máy chủ của bạn hoặc sử dụng logstash làm syslogd. Nó có một bộ lọc sẵn có, nhưng trên thực tế có xu hướng chịu đựng một chút từ không đủ linh hoạt, vì vậy thay vào đó tôi sử dụng một giao thức TCP/UDP người nghe, và phân tích các bản ghi một cách rõ ràng - như được nêu trong "When logstash and syslog goes wrong"

input { 
    tcp { 
    port => 514 
    type => syslog 
    } 
    udp { 
    port => 514 
    type => syslog 
    } 
} 

Và sau đó lọc nhật ký:

filter { 
    if [type] == "syslog" { 
    grok { 
     match => { "message" => "<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" } 
    } 
    syslog_pri { } 
    } 
} 

sau đó bạn có thể ăn logstash này để elasticsearch - hoặc trên một máy chủ từ xa, chứa địa phương hoặc những gì tôi đang làm bây giờ là một docker network với một nút đa elasticsearch dụ. (Tôi đã cuộn của riêng tôi bằng cách sử dụng một tập tin tải về và docker, nhưng tôi khá chắc chắn một container độc lập tồn tại quá).

output { 
    elasticsearch { 
     hosts => [ "es-tgt" ] 
    } 
} 

Ưu điểm ở đây là - Docker cho phép bạn sử dụng một trong hai --link hoặc --net để chỉ định tên của container elasticsearch của bạn, vì vậy bạn có thể chỉ bí danh config logstash để trỏ đến vị trí bên phải. (Ví dụ docker run -d --link my_es_container_name:es-tgt -p 514:514 -p 514:514/udp mylogstash hoặc chỉ docker run --net es_net ....)

Thiết lập docker network là hơi phức tạp hơn, trong đó bạn cần phải thiết lập một cửa hàng quan trọng có giá trị (Tôi đã từng etcd nhưng tùy chọn khác có sẵn). Hoặc bạn có thể làm điều gì đó giống như Kubernetes.

Và sau đó sử dụng kibana để trực quan hóa, một lần nữa để lộ cổng kibana, nhưng chuyển tiếp lên mạng elasticsearch để nói chuyện với cụm.

Nhưng khi thiết lập này được thiết lập, bạn có thể định cấu hình nginx thành log to syslog và mọi thứ khác bạn muốn thường xuyên ghi lại kết quả ghi nhật ký. IMO lợi thế thực sự là bạn đang sử dụng một dịch vụ duy nhất để ghi nhật ký, một dịch vụ có thể được thu nhỏ (nhờ vào mạng/container) theo nhu cầu của bạn.

+0

Cảm ơn điều này, nhưng tôi đã thực sự sau một câu trả lời giải quyết mối quan tâm chính của việc đăng nhập vào/dev/stdout. Tôi nghĩ rằng tôi có thể có điều đó ngay bây giờ, chỉ cần kiểm tra nó – geekscrap

+0

Đó là tốt. Bạn chỉ cần tham khảo nó trong các ý kiến, vì vậy tôi nghĩ rằng tôi muốn chip in. – Sobrique

Các vấn đề liên quan