首页 > 解决方案 > 如何从第二个服务中的第一个 docker-compose 服务获取容器 ID?

问题描述

我想在我的主应用程序容器旁边运行 filebeat 作为边车容器来收集应用程序日志。我正在使用 docker-compose 同时启动这两个服务,filebeat 取决于应用程序容器。

这一切都很好。我正在为应用程序日志使用共享卷。但是,我也想在 filebeat 中收集 docker 容器日志(stdout JSON 驱动程序)。

Filebeat 为此提供了一个 docker/container 输入模块。这是我的配置。第一部分是获取应用程序日志。第二部分应该得到 docker 日志:

filebeat.inputs:
- type: log
  paths:
    - /path/to/my/application/*.log.json
  exclude_lines: ['DEBUG']

- type: docker
  containers.ids: '*'
  json.message_key: message
  json.keys_under_root: true
  json.add_error_key: true
  json.overwrite_keys: true
  tags: ["docker"]

我不喜欢什么containers.ids: '*'。在这里,我想将 filebeat 指向直接应用程序容器,而忽略所有其他容器。由于在运行启动两个容器之前我不知道容器 ID docker-compose up,我想知道是否有一种简单的方法可以从我的 filebeat 容器中的应用程序容器中获取容器 ID(通过 docker-comnpose?)来过滤这个 ID ?

标签: dockerdocker-composefilebeat

解决方案


这也不是真正回答问题,但也应该作为解决方案。

主要思想是在 filebeat 自动发现过滤器中使用标签。

取自这篇文章:https ://discuss.elastic.co/t/filebeat-autodiscovery-filtering-by-container-labels/120201/5

filebeat.yml

filebeat.autodiscover:
  providers:
    - type: docker
      templates:
        - condition:
            contains:
              docker.container.labels.somelabel: "somevalue"
          config:
            - type: docker
              containers.ids:
                - "${data.docker.container.id}"

output.console:
  pretty: true

docker-compose.yml:

version: '3'

services:
  filebeat:
    image: docker.elastic.co/beats/filebeat:6.2.1
    command: "--strict.perms=false -v -e -d autodiscover,docker"
    user: root
    volumes:
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
      - /var/lib/docker/containers:/var/lib/docker/containers
      - /var/run/docker.sock:/var/run/docker.sock

  test:
    image: alpine
    command: "sh -c 'while true; do echo test; sleep 1; done'"
    depends_on:
      - filebeat
    labels:
      somelabel: "somevalue"

推荐阅读