Docker Build で Elasticsearch に初期データを投入しておきたい 🐳


はじめに

「ああ、、まちがえた...」
「やり直しや...」
「コンテナ再起動して、初期データ入れなおさなきゃ...」
Elasticsearchを開発で使っていると、こんなことがよくあります。

そんなあなたに、Dockerで使う開発環境用のElasticsearchに初期データを投入しておこうよ、という小ネタです。

環境

  • macOS Catalina
  • docker desktop 2.5.0.1
  • Elasticsearch 7.10
  • kibana 7.10 (おまけ)

データサンプル

Elasticsearch公式にある、シェイクスピアのデータを持ってきます。

Loading sample data | Kibana Guide [7.1] | Elastic

流れ

Dockerfile の中でデータを投入します。  

  1. JSONファイルをCOPY
  2. wait-for-it.shをCOPY
  3. Elascticsearchの起動を待って、bulkでデータ投入

です。

wait-for-it.sh というのは、サービスの起動を監視してくれるシェルスクリプトです。
Dockerの公式ドキュメントでも紹介されています。

Control startup and shutdown order in Compose | Docker Documentation

ファイルたち

githubにファイルを置いております。
jrfk/docker-es-entry-initial-data

Dockerfile

こんな感じです。


FROM docker.elastic.co/elasticsearch/elasticsearch:7.10.0

## data
RUN mkdir /data && chown -R elasticsearch:elasticsearch /data
COPY ./data/ /data/
RUN chmod 755 /data/*

## wait-for-it
ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /utils/wait-for-it.sh
RUN chown -R elasticsearch:elasticsearch /utils/wait-for-it.sh && chmod 755 /utils/wait-for-it.sh

## RUN
RUN echo 'discovery.type: single-node' >> config/elasticsearch.yml
RUN /usr/local/bin/docker-entrypoint.sh elasticsearch -p /tmp/epid & /bin/bash /utils/wait-for-it.sh -t 0 localhost:9200 -- /data/es_init.sh; kill $(cat /tmp/epid) && wait $(cat /tmp/epid); exit 0;

RUN echo 'discovery.type: single-node' >> config/elasticsearch.yml
ですが、第7世代のElasticsearchから、nodeの指定が必須です。
開発環境なのでsingle-nodeで使ってみましょう。

起動

以下のコマンドを実行してみましょう。

docker-compose build  
docker-compose up -d

確認

データが投入されていることが確認できるかと思います!

元ネタ

Stack Overflowに元ネタがあります。
このままやると、こんなエラーがでて起動できなくて。

ERROR: [1] bootstrap checks failed
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/docker-cluster.log

第7世代のElasticSearchで起動時にnodeの指定が必須になっているからでした。

How to add an elasticsearch index during docker build - Stack Overflow