如何在第二个服务中从第一个docker compose服务获取容器id?

如何在第二个服务中从第一个docker compose服务获取容器id?,docker,docker-compose,filebeat,Docker,Docker Compose,Filebeat,我想在主应用程序容器旁边运行filebeat作为一个侧车容器来收集应用程序日志。我使用docker compose同时启动这两个服务,具体取决于应用程序容器 这一切都很好。我正在为应用程序日志使用共享卷。 不过,我想在filebeat中收集docker容器日志(stdout JSON驱动程序) Filebeat为此提供了一个docker/container输入模块。这是我的配置。第一部分是获取应用程序日志。第二部分应获取docker日志: filebeat.inputs: - type: log

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

这一切都很好。我正在为应用程序日志使用共享卷。 不过,我想在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.id:'*'
。在这里,我想将filebeat指向直接应用程序容器,而忽略所有其他容器。
由于在运行
docker compose up
启动两个容器之前我不知道容器ID,我想知道是否有一种简单的方法可以从我的filebeat容器中的应用程序容器(通过docker comnpose?)获取容器ID以过滤此ID?

我想您可以解决这个问题:

首先将contianer中的所有日志设置为syslog:

driver: "syslog"
  options:
    syslog-address: "tcp://localhost:9000"
然后配置filebeat以从该系统日志服务器获取日志,如下所示:

filebeat.inputs:
- type: syslog
  protocol.udp:
    host: "localhost:9000"

我认为你可以解决这个问题:

首先将contianer中的所有日志设置为syslog:

driver: "syslog"
  options:
    syslog-address: "tcp://localhost:9000"
然后配置filebeat以从该系统日志服务器获取日志,如下所示:

filebeat.inputs:
- type: syslog
  protocol.udp:
    host: "localhost:9000"

这也不是真正的回答问题,但也应该是一个解决方案

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

摘自本帖:

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"

这也不是真正的回答问题,但也应该是一个解决方案

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

摘自本帖:

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"