我使用官方的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还是有完全不同的方法来实现它?
答案 0 :(得分:19)
我遇到了类似的问题。
我想创建一个带有预加载数据的docker容器(通过repo中的一些脚本和json文件)。 elasticsearch中的数据在执行期间不会改变,我希望尽可能少的构建步骤(理想情况下只有docker-compose up -d
)。
一种选择是手动执行一次,并将elasticsearch数据文件夹(带有docker卷)存储在存储库中。但是我会有重复数据,每次数据更改时我都必须手动检入数据文件夹的新版本。
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
此脚本将一直等到elasticsearch运行我们的insert命令。
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 .
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的东西