Elastic Stack [docker-elk] docker 使用 API 调用创建入口点索引

Elastic Stack [docker-elk] docker entry-point index creation using API calls

我正在使用 elastic stack 、elasticsearch logstash 和 kibana 开发一个项目。 现在的目标是使用docker到运行堆栈。基于此 https://github.com/deviantony/docker-elk 我将 docker-compose 配置为 运行 我自己的管道和我自己的解析。

我面临的问题是自动配置(创建索引模板 and/or 索引)。我知道我调用 use curl 来执行 API 调用,在搜索后我发现了入口点 shell 脚本,我尝试从官方图像复制脚本并添加我的 curl -XPUT 调用在那里,但它不起作用。 所以我的下一个反应是打开 CLI 并输入我的 curl 调用,它工作正常。

所以我的问题是如何在容器启动时 运行 我的 API 自动调用,我对 docker 和弹性堆栈还很陌生。

谢谢!

编辑:

所以我使用基本的 bash 图像和 curl 在我的 Dockerfile 上使用 运行 命令安装。

现在我在让服务进行通信时遇到问题(我将它们都放在同一个网络中)我可能做错了所以我得到:

curl: (7) Failed to connect to localhost port 9200: Connection refused

编辑:

更新了我的脚本以在不公开端口的情况下调用 elasticsearch:9200,现在工作正常!

我还认为脚本没有等待 elasticsearch 完成执行脚本。

这是我的 docker-compose 文件:

version: '3.2'

services:
  elasticsearch:
    build:
      context: elasticsearch/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./elasticsearch/config/elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
        read_only: true
      - type: volume
        source: elasticsearch
        target: /usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
      ELASTIC_PASSWORD: changeme
      # Use single node discovery in order to disable production mode and avoid bootstrap checks.
      # see: https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
      discovery.type: single-node
    networks:
      - elk

  configurator:
    build:
      context: configurator/
    networks:
      - elk
    depends_on:
      - elasticsearch

  logstash:
    build:
      context: logstash/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./logstash/config
        target: /usr/share/logstash/config
        read_only: true
      - type: bind
        source: ./logstash/pipeline
        target: /usr/share/logstash/pipeline
        read_only: true
      - type: bind
        source: ./logstash/data
        target: /usr/share/logstash/data
    ports:
      - "5044:5044"
      - "5000:5000/tcp"
      - "5000:5000/udp"
      - "9600:9600"
    environment:
      LS_JAVA_OPTS: "-Xmx256m -Xms256m"
    networks:
      - elk
    depends_on:
      - configurator

  kibana:
    build:
      context: kibana/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./kibana/config/kibana.yml
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - configurator

networks:
  elk:
    driver: bridge

volumes:
  elasticsearch:

创建一个新的手工 docker 图像(或使用一个好的启动图像),将您需要在启动时发出的 API 调用添加到启动脚本中。确保,它验证是否需要执行调用或所有调用都已由先前的 运行.

完成

接下来将图像添加到您的合成中,并使用 depends_on 选项使其依赖于 elasticsearch 服务。这将确保您的集群在启动 'init container'.

之前 运行ning

现在,启动时,将启动所需的服务(如果尚未启动 运行ning),然后启动 init 容器。

可选:使初始化容器默认不启动,但只有在明确启动时才启动。例如,查看启用 x 选项的监控服务 here

向服务添加 healthchecks 是一种很好的做法。如果您不这样做,docker 将仅根据容器状态 (运行ning=healthly) 假设服务健康。但是 elasticsearch 有一个更长的 bootstrap 我们需要等待的过程。

将以下内容添加到 elasticsearch:

healthcheck:
  test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
  interval: 30s
  timeout: 30s
  retries: 5

并将其添加到配置器服务中:

depends_on:
  elasticsearch:
    condition: service_healthy