【问题标题】:How to add an elasticsearch index during docker build如何在 docker build 期间添加 elasticsearch 索引
【发布时间】:2016-06-02 06:42:01
【问题描述】:

我使用了官方的 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,还是有完全不同的方法来实现它?

【问题讨论】:

    标签: elasticsearch docker


    【解决方案1】:

    如果我有您的问题,您甚至在其主机(即 docker 容器运行)之前尝试连接 ElasticSearch 实例。你需要先让你的容器运行起来。

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

    【讨论】:

    • 感谢您的回复。您确定在构建期间无法添加索引吗?我不能把它复制到特定的文件夹吗?
    • @crisscross 据我了解,您正在尝试构建您的 docker,一旦构建完成,您希望 docker 准备好一个 ES 实例,让它运行,然后创建一个默认索引。如果是这种情况,那么从逻辑上讲,后期构建脚本对我来说看起来不错。在我们对其进行操作之前,肯定需要运行 docker 容器。关于文件夹,您可以将它与使用 bash 配置文件的启动 shell 脚本结合使用。也就是说,运行后脚本对我来说看起来更干净。
    • 嗯,这仍然没有回答我的问题如何在构建期间或已经运行时添加索引。
    【解决方案2】:

    我也遇到过类似的问题。

    我想创建一个带有预加载数据的 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. 下载wait-for-it

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

    此脚本将等到 elasticsearch 启动后运行我们的插入命令。

    1. 将数据插入到弹性搜索中

    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;
    

    就是这样!当你运行这个镜像时,数据库会预加载数据、索引等...

    【讨论】:

    • 顺便说一句,在这种特定情况下,我的解决方案的第 3 步将是:RUN /docker-entrypoint.sh elasticsearch -p /tmp/epid & /utils/wait-for-it.sh -t 0 localhost:9200 -- curl -XPUT 'http://127.0.0.1:9200/myindex' -d @index.json; kill $(cat /tmp/epid) && wait $(cat /tmp/epid); exit 0; 不需要额外的脚本,尽管将整个命令放在其中有点难看。
    • 好奇这将如何在当今实现?另外,您在来自 es-docker 源的答案中提到的“docker-entrypoint.sh”脚本是吗?
    • @Bryce 我认为自从原始答案以来它并没有变得更容易。但这并不意味着没有其他选择。您可以在本地插入弹性搜索后保留数据文件夹的副本,然后将其作为卷安装在 docker run 上。如果你想运行任意 ES 命令,至少这是你能做的最好的事情。如果您想要的只是索引,您可以使用简单的 ADD 指令将其添加为索引模板:ADD myindex.json /etc/elasticsearch/templates/(没有尝试过,只是猜测命令)。请记住,这种方法不会创建索引,只定义它的映射
    • @Bryce,我所看到的只是弹性具有更好的 docker 支持,但我没有看到任何指令,如 postgresql 使用他们的 /docker-entrypoint-initdb.d/ 文件夹填充数据库。如果这可能发生,我会很高兴的 ;-) fatih tekin 的回答是沿着同样的思考过程 +1
    【解决方案3】:

    执行此操作的简单方法是在 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

    【讨论】:

    猜你喜欢
    • 2018-12-30
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多