私は公式の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に到達できますか、それを実装するための完全に異なる方法はありますか?
同様の問題がありました。
(リポジトリ内のスクリプトとjsonファイルを介して)データがプリロードされたDockerコンテナーを作成したいと思いました。 elasticsearch内のデータは実行中に変更されることはなく、できるだけ少ないビルドステップ(理想的には_docker-compose up -d
_のみ)が必要でした。
1つのオプションは、手動で1回実行し、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が挿入コマンドを実行できるようになるまで待機します。
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;
_
以上です!このイメージを実行すると、データベースにプリロードされたデータ、インデックスなどが含まれます...
これを行う簡単な方法は、以下の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
を実行します
私の質問がある場合、ホスト、つまりDockerコンテナーが実行されている前でもElasticSearchインスタンスに接続しようとしています。最初にコンテナを実行する必要があります。
Bashオプションを使用して実行できるシェルスクリプトを作成できます。 docker runのようなもの