获取 docker 无需 root 即可登录到 filebeat
Get docker logs into filebeat without root
我正在尝试从我所有的 运行ning docker 容器中收集日志并将它们发送到 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 守护进程,没有其他人。”.
必须有更好的方法让 docker 容器登录到 filebeat 中,而不是让 filebeat 容器 运行 以根目录访问显然甚至不应该访问的文件夹。我是否需要从默认的 docker 日志记录驱动程序切换到其他受支持的驱动程序之一?
您可以重新配置 Jenkins 容器以将其日志文件发布到主机目录(使用 docker run -v
为 /var/jenkins_home/jobs
树提供一些主机目录;这可能是个好主意,因为您如果你需要更新底层的 Jenkins 代码,不想丢失你所有的工作历史)。然后,您可以使用 docker run -v
将同一目录注入 Filebeat 容器,或者直接在主机上 运行 Filebeat(如果其主要工作是读取主机系统文件...)。
如果您有选择并且处于更高效的设置中,切换日志驱动程序以指向您的 logstash 也是一个好主意,但这只会收集主进程的标准输出和标准错误(而不是必须 运行 docker logs
该数据将显示在您的中央日志服务器上)。不过,这不会收集每个 Jenkins 作业的日志文件。
我的经验与您引用的 Vagrant 错误一致:永远不要查看 /var/lib/docker
内部,尤其不要尝试将 Docker 的内部状态装载到 Docker 容器中。 (您可能不会出现内核恐慌。)
我正在尝试从我所有的 运行ning docker 容器中收集日志并将它们发送到 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 守护进程,没有其他人。”.
必须有更好的方法让 docker 容器登录到 filebeat 中,而不是让 filebeat 容器 运行 以根目录访问显然甚至不应该访问的文件夹。我是否需要从默认的 docker 日志记录驱动程序切换到其他受支持的驱动程序之一?
您可以重新配置 Jenkins 容器以将其日志文件发布到主机目录(使用 docker run -v
为 /var/jenkins_home/jobs
树提供一些主机目录;这可能是个好主意,因为您如果你需要更新底层的 Jenkins 代码,不想丢失你所有的工作历史)。然后,您可以使用 docker run -v
将同一目录注入 Filebeat 容器,或者直接在主机上 运行 Filebeat(如果其主要工作是读取主机系统文件...)。
如果您有选择并且处于更高效的设置中,切换日志驱动程序以指向您的 logstash 也是一个好主意,但这只会收集主进程的标准输出和标准错误(而不是必须 运行 docker logs
该数据将显示在您的中央日志服务器上)。不过,这不会收集每个 Jenkins 作业的日志文件。
我的经验与您引用的 Vagrant 错误一致:永远不要查看 /var/lib/docker
内部,尤其不要尝试将 Docker 的内部状态装载到 Docker 容器中。 (您可能不会出现内核恐慌。)