web-dev-qa-db-fra.com

Comment ajouter un index elasticsearch lors de la construction de docker

J'utilise l'image officielle du docker elasticsearch et je me demande comment inclure également lors de la création d'un index personnalisé, de sorte que l'index soit déjà présent lorsque je démarre le conteneur. 

Ma tentative consistait à ajouter la ligne suivante à mon fichier docker:

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

Je reçois l'erreur suivante: 

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

Puis-je accéder à elasticsearch lors de la construction avec un tel appel d'API ou existe-t-il une manière complètement différente de l'implémenter? 

16
crisscross

J'ai eu un problème similaire.

Je voulais créer un conteneur Docker avec des données préchargées (via des scripts et des fichiers JSON dans le référentiel). Les données à l'intérieur d'elasticsearch n'allaient pas changer pendant l'exécution et je voulais le moins d'étapes de construction possible (idéalement, seulement docker-compose up -d).

Une option serait de le faire manuellement une fois et de stocker le dossier de données elasticsearch (avec un volume de menu fixe) dans le référentiel. Mais alors, j'aurais eu des données en double et je devrais enregistrer manuellement une nouvelle version du dossier de données à chaque fois que les données sont modifiées.

La solution

  1. Faites en sorte que elasticsearch écrive des données dans un dossier qui n’est pas déclaré comme un volume dans le fichier de docker officiel d’elasticsearchs.

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

(le dossier doit être créé avec les bonnes autorisations)

  1. Télécharger wait-for-it

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

Ce script attendra que elasticsearch soit prêt pour exécuter nos commandes d'insertion.

  1. Insérer des données dans 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;

Cette commande lance elasticsearch pendant le processus de construction, insère des données et les enregistre dans une commande RUN. Le conteneur est laissé tel quel, à l'exception du dossier de données d'elasticsearch qui a été correctement initialisé.

Résumé

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;

Et c'est tout! Lorsque vous exécutez cette image, la base de données contient des données préchargées, des index, etc.

17
Erpheus

Le moyen simple de le faire pourrait être d'utiliser ci-dessous Dockerfile.

Exécuter ce fichier Docker avec 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/

Et puis lancez simplement docker run -t -d elasticsearch-custom:latest

2
fatih tekin

Si j’ai compris votre question, vous essayez de vous connecter à une instance ElasticSearch même avant que son conteneur Host i.e. docker ne soit en cours d’exécution. Vous devez d'abord faire fonctionner votre conteneur.

Vous pouvez créer un script shell que vous pouvez exécuter à l'aide de l'option bash. Quelque chose comme docker run 

0
Anuj Yadav