如何在docker build期间添加elasticsearch索引

我使用官方的elasticsearch docker镜像,想知道如何在构build一个自定义索引的时候包含这个索引,以便在启动容器时索引已经存在。

我的尝试是将以下行添加到我的dockerfile:

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 

在使用这种API调用构build期间是否可以实现elasticsearch?还是有完全不同的方式来实现?

我有类似的问题。

我想创build一个预加载数据的docker容器(通过repo中的一些脚本和json文件)。 elasticsearch内部的数据在执行期间不会改变,我希望尽可能less的构build步骤(理想情况下,只有docker-compose up -d )。

一种方法是手动执行一次,并将弹性search数据文件夹(使用docker卷)存储在存储库中。 但是,我会有重复的数据,每次数据更改时,我将不得不手动检查数据文件夹的新版本。

解决scheme

  1. 使elasticsearch将数据写入到不在elasticsearchs官方dockerfile中声明为卷的文件夹中。

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

(该文件夹需要使用正确的权限创build)

  1. 下载等待它

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;

该命令在构build过程中启动elasticsearch,插入数据并将其logging在一个RUN命令中。 容器保持原状,除了弹性search的数据文件夹已被正确初始化。

概要

 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; 

而就是这样! 当你运行这个镜像时,数据库将会有预加载的数据,索引等等。

如果我有你的问题,你甚至在它的主机,即docker容器正在运行之前,试图连接ElasticSearch实例。 你需要让你的容器先运行。

您可以创build一个可以使用bash选项执行的shell脚本。 像docker运行的东西