web-dev-qa-db-ja.com

docker build中にelasticsearchインデックスを追加する方法

私は公式の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に到達できますか、それを実装するための完全に異なる方法はありますか?

26
crisscross

同様の問題がありました。

(リポジトリ内のスクリプトとjsonファイルを介して)データがプリロードされたDockerコンテナーを作成したいと思いました。 elasticsearch内のデータは実行中に変更されることはなく、できるだけ少ないビルドステップ(理想的には_docker-compose up -d_のみ)が必要でした。

1つのオプションは、手動で1回実行し、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. ダウンロード it-for-it

_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;

このコマンドは、ビルドプロセス中にelasticsearchを開始し、データを挿入して、1つの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;
_

以上です!このイメージを実行すると、データベースにプリロードされたデータ、インデックスなどが含まれます...

25
Erpheus

これを行う簡単な方法は、以下の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/

そしてdocker run -t -d elasticsearch-custom:latestを実行します

8
fatih tekin

私の質問がある場合、ホスト、つまりDockerコンテナーが実行されている前でもElasticSearchインスタンスに接続しようとしています。最初にコンテナを実行する必要があります。

Bashオプションを使用して実行できるシェルスクリプトを作成できます。 docker runのようなもの

0
Anuj Yadav