【问题标题】:Elastic Stack [docker-elk] docker entry-point index creation using API callsElastic Stack [docker-elk] 使用 API 调用创建 docker 入口点索引
【发布时间】:2020-12-16 14:57:27
【问题描述】:

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

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

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

谢谢!

编辑:

所以我使用基本的 bash 映像和 curl 在我的 Dockerfile 上使用 RUN 命令安装了它。

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

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 elasticsearch docker-compose elastic-stack


    【解决方案1】:

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

    接下来将图像添加到您的组合中,并使用 depends_on 选项使其依赖于弹性搜索服务。这将确保您的集群在启动“初始化容器”之前正在运行。

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

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

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

    将以下内容添加到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
    

    【讨论】:

    • 嗨,感谢您抽出宝贵的时间来回答,但是您能否更明确地了解启动脚本,这是我不确定的。 (因为我使用的图像从弹性中提取了官方图像)
    • 哦,现在我明白了,你的意思是一个只有一个操作系统而不是弹性搜索的新映像,得到它可以在上面工作,然后回到这里!
    • Exsctly,只是一个支持 curl 等的最小图像。
    • 我使用了 bash curl 和 SSL 附带的图像,但是一旦 compose 开始,除此之外的所有其他图像都会运行,我不知道为什么!
    • 我可以要求 compose.yml 吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多