Как добавить индекс elasticsearch во время сборки докеров

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

Моя попытка состояла в том, чтобы добавить следующую строку в мой файл докеров:

RUN curl -XPUT 'http://127.0.0.1:9200/myindex' -d @index.json

Я получаю следующую ошибку:

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

Могу ли я получить elasticsearch во время сборки с таким вызовом API или есть ли совершенно другой способ реализовать это?

Ответ 1

У меня была аналогичная проблема.

Я хотел создать контейнер докеров с предварительно загруженными данными (через некоторые скрипты и json файлы в репо). Данные внутри elasticsearch не собирались меняться во время исполнения, и я хотел как можно меньше шагов сборки (в идеале, только docker-compose up -d).

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

Решение

  1. Сделать elasticsearch записывать данные в папку, которая не объявлена как тома в официальном файле docser elasticsearchs.

RUN mkdir/data && chown -R elasticsearch:elasticsearch/data && echo 'es.path.data: /data' >> config/elasticsearch.yml && echo 'path.data: /data' >> config/elasticsearch.yml

(папка должна быть создана с правильными разрешениями)

  1. Загрузите wait-for-it

ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/e1f115e4ca285c3c24e847c4dd4be955e0ed51c2/wait-for-it.sh/utils/wait-for-it.sh

Этот скрипт будет ждать, пока elasticsearch не запустит наши команды вставки.

  1. Вставка данных в поиск elastics

RUN/docker-entrypoint.sh elasticsearch -p/tmp/epid &/bin/bash/utils/wait-for-it.sh -t 0 localhost:9200 -- path/to/insert/script.sh; kill $(cat/tmp/epid) && wait $(cat/tmp/epid); exit 0;

Эта команда запускает elasticsearch во время процесса сборки, вставляет данные и выводит их в одну команду RUN. Контейнер оставлен таким, какой он есть, за исключением папки данных elasticsearch, которая была правильно инициализирована.

Резюме

FROM elasticsearch

RUN mkdir /data && chown -R elasticsearch:elasticsearch /data && echo 'es.path.data: /data' >> config/elasticsearch.yml && echo 'path.data: /data' >> config/elasticsearch.yml

ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/e1f115e4ca285c3c24e847c4dd4be955e0ed51c2/wait-for-it.sh /utils/wait-for-it.sh

# Copy the files you may need and your insert script

RUN /docker-entrypoint.sh elasticsearch -p /tmp/epid & /bin/bash /utils/wait-for-it.sh -t 0 localhost:9200 -- path/to/insert/script.sh; kill $(cat /tmp/epid) && wait $(cat /tmp/epid); exit 0;

И это! Когда вы запустите это изображение, база данных будет иметь предварительно загруженные данные, индексы и т.д....

Ответ 2

Если у меня возникли вопросы, вы пытаетесь подключиться к экземпляру ElasticSearch еще до того, как его хост, т.е. контейнер докеров, запущен. Сначала вы должны запустить свой контейнер.

Вы можете создать сценарий оболочки, который можно выполнить с помощью опции bash. Что-то вроде docker run