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?
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.
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)
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.
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é.
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.
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
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