首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elastic Stack [ docker -elk]使用API调用创建docker入口点索引

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

Stack Overflow用户
提问于 2020-12-16 22:57:27
回答 1查看 213关注 0票数 0

我正在做一个使用弹性堆栈,elasticsearch logstash和kibana的项目。现在的目标是使用docker来运行堆栈。基于这个https://github.com/deviantony/docker-elk,我将docker-compose配置为使用我自己的解析来运行我自己的管道。

我面临的问题是自动配置(创建索引模板和/或索引)。我知道我调用curl来做API调用,经过搜索我发现了入口点-XPUT脚本,我尝试从官方镜像复制脚本,并在其中添加我的curl API调用,但不起作用。因此,我的下一个反射是打开CLI并输入我的curl调用,它工作得很好。

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

谢谢!

编辑:

因此,我在Dockerfile上使用RUN命令安装了一个基本的bash镜像和curl。

现在我有一个让服务通信的问题(我把它们都放在同一个网络中),我可能做错了,所以我得到了:

代码语言:javascript
复制
curl: (7) Failed to connect to localhost port 9200: Connection refused

编辑:

更新了我的脚本,在不暴露端口的情况下调用elasticsearch:9200,现在它工作得很好!

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

这是我的docker-compose文件:

代码语言:javascript
复制
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:
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-17 04:13:32

创建一个新的手工docker镜像(或使用良好的启动镜像),将您需要在启动时发出的API调用添加到启动脚本中。确保它验证是否需要执行这些调用,或者上一次运行已经完成了所有操作。

接下来,将图像添加到您的compse中,并使其依赖于带有depends_on选项的elasticsearch服务。这将确保您的集群在启动“init容器”之前正在运行。

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

可选:使init容器在默认情况下不启动,但仅在显式启动时启动。例如,看一下监视器服务和启用x的选项here

healthchecks添加到服务中是一个很好的做法。如果您不这样做,docker将仅通过容器状态(running=healthly)来假定服务健康。但是elasticsearch有一个更长的引导过程,我们需要等待。

将以下内容添加到elasticsearch:

代码语言:javascript
复制
healthcheck:
  test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
  interval: 30s
  timeout: 30s
  retries: 5

并将此代码添加到配置器服务中:

代码语言:javascript
复制
depends_on:
  elasticsearch:
    condition: service_healthy
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65325744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档