Elastic Stack [docker-elk] создание индекса точки входа в докер с использованием вызовов API

Я работаю над проектом, используя эластичный стек, elasticsearch logstash и kibana. Теперь цель состоит в том, чтобы использовать докер для запуска стека. на основе этого https://github.com/deviantony/docker-elk я настроил docker-compose для запуска собственных конвейеров с собственным разбором.

Проблема, с которой я столкнулся, - это автоматическая настройка (создание шаблонов индексов и/или индексов). Я знаю, что использую curl для выполнения вызовов API, после поиска я узнал о сценарии оболочки точки входа, я попытался скопировать сценарий из официального образа и добавить туда свои вызовы curl -XPUT, но это не работает. Поэтому моим следующим рефлексом было открыть интерфейс командной строки и ввести вызовы curl, и он отлично работает.

Итак, мой вопрос: как я могу автоматически запускать вызовы API при запуске контейнера, я новичок в докере и эластичном стеке.

Спасибо !

Обновлено:

Итак, я заработал с базовым образом bash и curl, установленным с помощью команды RUN в моем Dockerfile.

теперь у меня проблема с обменом данными со службами (я поместил их всех в одну сеть), я, вероятно, делаю это неправильно, поэтому я получаю:

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

редактировать :

обновил мои сценарии для вызова elasticsearch: 9200 без раскрытия портов, и теперь он работает нормально!

я также думаю, что скрипт не ждет, когда elasticsearch закончит выполнение скрипта.

Вот мой файл для создания докеров:

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:
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
0
825
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте новый образ docker ручной работы (или используйте хороший стартовый образ), добавьте вызовы API, которые необходимо выполнить при запуске, в сценарий запуска. Убедитесь, что он проверяет, нужно ли выполнять вызовы или все уже сделано предыдущим запуском.

Затем добавьте изображение в композицию и сделайте его зависимым от сервиса elasticsearch с опцией depends_on. Это гарантирует, что ваш кластер будет запущен до запуска вашего «контейнера инициализации».

Теперь при запуске будут запущены нужные службы (если они еще не запущены) и после этого запустится init контейнер.

Необязательно: сделайте так, чтобы контейнер инициализации не запускался по умолчанию, а только в том случае, если он явно запущен. Например, посмотрите на службу монитора и опцию с поддержкой x здесь

Хорошей практикой является добавление проверок здоровья к услугам. Если вы этого не сделаете, докер будет считать работоспособность службы только по состоянию контейнера (работает = исправен). Но у 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

привет, спасибо, что нашли время ответить, но не могли бы вы более подробно рассказать о сценариях запуска, в этом я не уверен. (потому что изображение, которое я использую, извлекает официальное изображение из эластичного)

Bob Maza 17.12.2020 14:25

О, теперь я понял, вы имеете в виду новый образ только с ОС, а не с эластичным поиском, он будет работать на нем и вернется сюда!

Bob Maza 17.12.2020 14:40

Точно, просто минимальное изображение с поддержкой завитков и т. д.

ibexit 17.12.2020 15:29

я использовал изображение, которое поставляется с bash curl и SSL, но как только начинается компоновка, запускаются все остальные изображения, кроме этого, и я понятия не имею, почему!

Bob Maza 22.12.2020 14:27

могу я попросить compose.yml?

ibexit 22.12.2020 14:40

я вернулся, счастливых праздников, так что мой образ работает, теперь у меня проблемы с выполнением и сетью, я обновляю пост!

Bob Maza 07.01.2021 17:22

Счастливых праздников! вероятно, это просто проблема времени / условия гонки. служба конфигуратора запускается, как только elasticsearch становится доступным, но все еще загружается. рекомендуется добавлять проверки работоспособности к службам. Я обновлю свой ответ, чтобы показать использование проверки работоспособности.

ibexit 07.01.2021 17:36

Спасибо за советы и информацию! я почти там! теперь мне приходится иметь дело с сетевыми проблемами, curl не удалось подключиться к хосту, если я запускаю те же вызовы curl на хосте (моя машина), он работает нормально, но я не могу заставить его работать из контейнера (службы) в другой.

Bob Maza 08.01.2021 11:49

служба конфигуратора предоставляет тот же порт, что и служба elasticssearch (9200:9200) - это не может работать. Можете ли вы также уточнить, какой вызов (пример) работает с вашего хоста, но не работает со службой (какая служба)?

ibexit 08.01.2021 12:16

поэтому, если я правильно понимаю, для elasticsearch мы делаем хост 9200 эквивалентным локальному (контейнеру) 9200, в моем сценарии мои вызовы curl относятся к localhost: 9200, я удалил часть портов в своих тестах, но цель здесь в том, что я могу вызвать хостам 9200, поэтому я должен сделать порты: 9200:some_other_port_locally? (я пробовал это, и я все еще получаю отказ в соединении)

Bob Maza 08.01.2021 12:27

Поскольку обе службы находятся в одной и той же сети elk, они видны и доступны друг для друга по имени службы, которое вы использовали в файле compse. поэтому, если вы хотите вызвать elasticsearch из конфигуратора, используйте в скрипте asticsearch:9200 . вам даже не нужно раскрывать какой-либо порт, так как все порты по умолчанию видны и в сети elk. Только если вам нужна служба, доступная с вашего хоста, вам нужно будет открыть порт, чтобы вызвать kibana, например, с помощью localhost: 5601.

ibexit 08.01.2021 12:35

проверка здоровья elasticsearch использует localhost:9200, так как ссылается на себя. конфигуратор должен вызвать elasticsearch:9200, так как он относится к другому сервису в той же сети. и сформируйте свою машину, вам нужно использовать locahost плюс порт, который вы указали, который является localhost: 5601 в случае kibanas

ibexit 08.01.2021 12:37

я пробовал это (без раскрытия портов и вызовом elasticsearch: 9200), но это не сработало, я удалил все и снова построил, и теперь он работает, как и ожидалось! спасибо за помощь и терпение!

Bob Maza 08.01.2021 14:18

Ваше здоровье! Отличная работа! Веселиться!

ibexit 08.01.2021 15:33

Другие вопросы по теме

Похожие вопросы