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

cri*_*oss 22 elasticsearch docker

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

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

RUN curl -XPUT 'http://127.0.0.1:9200/myindex' -d @index.json
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

0curl: (7) Failed to connect to 127.0.0.1 port 9200: Connection refused
Run Code Online (Sandbox Code Playgroud)

我可以在使用这样的API调用构建期间到达elasticsearch还是有完全不同的方法来实现它?

Erp*_*eus 22

我有类似的问题.

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

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

解决方案

  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

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

  1. 下载等待它

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

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

  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;
Run Code Online (Sandbox Code Playgroud)

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

  • @Bryce 我认为自最初的答案以来它并没有变得更容易。但这并不意味着没有其他选择。您可以在本地插入 elasticsearch 后保留数据文件夹的副本,然后将其作为卷安装在 docker run 上。如果你想运行任意 ES 命令,至少这是你能做的最好的事情。如果您想要的只是索引,您可以使用简单的 ADD 指令将其添加为索引模板:`ADD myindex.json /etc/elasticsearch/templates/`(没试过,只是猜测命令)。请记住,这种方法不会创建索引,只会定义其映射 (2认同)
  • @Bryce,我所看到的只是 elastic 有更好的 docker 支持,但我还没有看到任何指令,比如 postgresql 用他们的 /docker-entrypoint-initdb.d/ 文件夹来填充数据库。如果这可能发生,我会很高兴;-) fatih tekin 的回答是沿着相同的思考过程 +1 (2认同)

fat*_*kin 7

最简单的方法可以在Dockerfile下面使用。

使用以下命令运行此Dockerfile 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/
Run Code Online (Sandbox Code Playgroud)

然后运行 docker run -t -d elasticsearch-custom:latest

  • 采取了这个答案,并构建了https://github.com/gaving/es-bundled-template,并用curl替换了依赖项。 (2认同)