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