Получить Docker логов в filebeat без рута - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь собрать логи со всех моих работающих док-контейнеров и отправить их в стек ELK.Я хотел бы использовать filebeat для этого, поэтому я придерживаюсь подхода, аналогичного описанному в https://logz.io/blog/docker-logging/.

Мой filebeat.yml

filebeat:
  inputs:
  - paths:
    - /var/jenkins_home/jobs/*/branches/*/builds/*/log
    document_type: jenkinslog
  - type: docker
    containers.ids: '*'
    document_type: docker     
output:
  logstash:
    hosts: ["logstash:5044"]

Мой Dockerfile:

FROM docker.elastic.co/beats/filebeat:6.5.2
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
USER root
RUN chown root:filebeat /usr/share/filebeat/filebeat.yml

Моя команда для запуска этого образа:

docker run --rm --name filebeat_container --volumes-from jenkins_container:ro -v /var/lib/docker:/var/lib/docker --network=ttydinternproject_default filebeatimage

Я монтирую папку / var / lib / docker как том и должен иметь root-доступ для доступа к нему, как показано нижеhttps://github.com/hashicorp/vagrant/issues/6822#issuecomment-169826764 "/ var / lib / docker предназначен для демона docker и больше ни для кого.".

Должен существовать лучший способ получения журналов докер-контейнеров в filebeat, чем выход из контейнера filebeatзапуск root для доступа к папкам, по-видимому, даже не должен быть доступен.Нужно ли мне переключаться со стандартного драйвера ведения журнала докера на другой поддерживаемый?

1 Ответ

0 голосов
/ 19 декабря 2018

Вы можете перенастроить свой контейнер Jenkins для публикации его файлов журнала в каталоге хоста (используйте docker run -v, чтобы предоставить некоторый каталог хоста для дерева /var/jenkins_home/jobs; это, вероятно, хорошая идея, несмотря на то, что вы не хотите терятьвся ваша история работы, если вам когда-нибудь понадобится обновить базовый код Jenkins).Затем вы можете либо использовать docker run -v для внедрения этого же каталога в контейнер Filebeat, либо просто запустить Filebeat непосредственно на хосте (если его основное задание - чтение файлов системы хоста ...).

Если выесть возможность и более производительная настройка, переключение драйверов журналов, чтобы они указывали на ваш logstash, также является хорошей идеей, но при этом будут собираться только stdout и stderr основного процесса (вместо того, чтобы запускать docker logs, эти данные будут отображатьсяна вашем центральном сервере журналов).Однако он не будет собирать файлы журналов по заданию Jenkins.

Мой опыт согласуется с ошибкой Vagrant, которую вы цитируете: никогда не заглядывайте внутрь /var/lib/docker и особенно не пытайтесь смонтировать внутреннее состояние Докерав контейнер Docker.(У вас , вероятно, не будет паники ядра.)

...