はじめに
「ああ、、まちがえた...」
「やり直しや...」
「コンテナ再起動して、初期データ入れなおさなきゃ...」
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 の中でデータを投入します。
- JSONファイルをCOPY
- wait-for-it.shをCOPY
- 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