首页 > 解决方案 > 在 docker 中运行 Filebeat 作为 IoT Edge 模块

问题描述

我想在 Azure IoT Edge中将 Filebeat作为 Docker 容器运行。我希望 Filebeat 从其他运行容器的日志中获取日志。

从文档( https://www.elastic.co/guide/en/beats/filebeat/6.8/running-on-docker.html#_volume_mounted_configuration)中,我已经能够将 filebeat 作为 Docker 容器运行

docker run -d \
  --name=filebeat \
  --user=root \
  --volume="$(pwd)/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro" \
  --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
  --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
  docker.elastic.co/beats/filebeat:6.8.3 filebeat -e -strict.perms=false

使用此命令和正确的filebeat.yml文件,我可以收集设备上每个正在运行的容器的日志。

现在我想将此配置部署为 Azure IoT Edge 模块。

我创建了一个filebeat.yml包含以下 Dockerfile 的文件的 docker 映像:

FROM docker.elastic.co/beats/filebeat:6.8.3
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
USER root
RUN chmod go-w /usr/share/filebeat/filebeat.yml
RUN chown root:filebeat /usr/share/filebeat/filebeat.yml
USER filebeat

来自文档:https ://www.elastic.co/guide/en/beats/filebeat/6.8/running-on-docker.html#_custom_image_configuration

我通过在本地运行测试了这个 Dockerfile

docker build -t filebeat .

docker run -d \
  --name=filebeat \
  --user=root \
  --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
  --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
  filebeat:latest filebeat -e -strict.perms=false

这很好用,来自其他容器的日志会按应有的方式收集。

现在我的问题是:

--volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \ 
--volume="/var/run/docker.sock:/var/run/docker.sock:ro"

为了收集日志?

从 Azure IoT Edge 门户中的其他 SO 帖子(安装路径到 Azure IoT Edge 模块),我尝试了以下操作:

  "HostConfig": {
    "Mounts": [
      {
        "Target": "/var/lib/docker/containers",
        "Source": "/var/lib/docker/containers",
        "Type": "volume",
        "ReadOnly: true
      },
      {
        "Target": "/var/run/docker.sock",
        "Source": "/var/run/docker.sock",
        "Type": "volume",
        "ReadOnly: true
      }
    ]
  }
}

但是当我部署这个模块时,我有以下错误:

2019-11-25T10:09:41Z [WARN] - Could not create module FilebeatAgent
2019-11-25T10:09:41Z [WARN] -         caused by: create /var/lib/docker/containers: "/var/lib/docker/containers" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path

我不明白这个错误。如何仅使用指定路径[a-zA-Z0-9][a-zA-Z0-9_.-]

谢谢你的帮助。

编辑

在 Azure IoT Edge 门户中,createOptions json:

{
  "HostConfig": {
    "Binds": [
      "/var/lib/docker/containers:/var/lib/docker/containers",
      "/var/run/docker.sock:/var/run/docker.sock"
    ]
  }
}

标签: dockerdocker-composefilebeatazure-iot-edge

解决方案


这里有一篇文章描述了如何从主机挂载存储:https ://docs.microsoft.com/en-us/azure/iot-edge/how-to-access-host-storage-from-module


推荐阅读