Я использую официальный образ докера 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 или есть совершенно другой способ реализовать это?

31
crisscross 20 Фев 2016 в 20:23

3 ответа

Лучший ответ

У меня была похожая проблема.

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

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

Решение

  1. Заставьте elasticsearch записывать данные в папку, которая не объявлена как том в официальном файле dockerfile 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. Вставить данные в elasticsearch

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;

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

29
Erpheus 5 Окт 2016 в 12:04

Самый простой способ сделать это - использовать Dockerfile ниже.

Запустите этот файл Docker с помощью docker build -t elasticsearch-custom:latest .

FROM elasticsearch:5.5.1 AS esbuilder
ADD script.sh path/to/insert/script.sh
RUN apt-get update \
    && apt-get install procps -y \
    && apt-get install httping -y \
    && /docker-entrypoint.sh elasticsearch -d -E path.data=/tmp/data \
    && while ! httping -qc1 http://localhost:9200 ; do sleep 1 ; done \
    && path/to/insert/script.sh \
    && apt-get clean

FROM elasticsearch:5.5.1
COPY --from=esbuilder /tmp/data/ /usr/share/elasticsearch/data/

А затем просто запустите docker run -t -d elasticsearch-custom:latest

11
fatih tekin 27 Окт 2018 в 07:38

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

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

0
Anuj Yadav 20 Фев 2016 в 18:13