如何在docker构建期间添加elasticsearch索引

时间:2016-02-20 17:23:05

标签: elasticsearch docker

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

我的尝试是将以下行添加到我的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调用构建期间到达elasticsearch还是有完全不同的方法来实现它?

3 个答案:

答案 0 :(得分:19)

我遇到了类似的问题。

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

一种选择是手动执行一次,并将elasticsearch数据文件夹(带有docker卷)存储在存储库中。但是我会有重复数据,每次数据更改时我都必须手动检入数据文件夹的新版本。

解决方案

  1. 使elasticsearch将数据写入未在elasticsearchs官方dockerfile中声明为卷的文件夹。
  2. 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
    2. ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/e1f115e4ca285c3c24e847c4dd4be955e0ed51c2/wait-for-it.sh /utils/wait-for-it.sh

      此脚本将一直等到elasticsearch运行我们的insert命令。

      1. 将数据插入elasticsearch
      2. 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;
        

        就是这样!运行此映像时,数据库将预先加载数据,索引等...

答案 1 :(得分:4)

执行此操作的简单方法可以在Dockerfile下面使用。

使用docker build -t elasticsearch-custom:latest .

运行此Dockerfile
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

答案 2 :(得分:0)

如果我收到您的问题,您甚至在其主机即Docker容器运行之前尝试连接ElasticSearch实例。您需要先让容器运行。

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