kenjuの日記

About Programming, Mathematics and Security

Circle CIで動かす用のDocker Image for Elasticsearchを作った

github.com

Circle CI 2.0 Betaに移行する中で必要だったので、Docker Imageを作成して公開した。

課題

Circle CIなどのCI環境でElasticsearchを動かそうとすると、メモリが足りずにOOMエラーで落ちることがある。 そうした場合、vm.max_map_countオプションなどをいじってElasticsearchを動かせばいい。 しかし、Circle CIなどでは変更できるシステム設定に限りがある。

解決策

Elasticsearchコンテナを立ち上げるときに

  • indices.fielddata.cache.size を低めに設定する
  • indices.breaker.fielddata.limit を低めに設定する

ことで、ある程度メモリ容量が制限されたCI環境でも動くような設定ができる。

それらをまるっとまとめて公開したのが、先のDocker Image。

使い方

docker pull bitjourney/elasticsearch-ci

補足

↓がelasticsearcy.ymlの全体像:

cluster.name: "docker-ci-cluster"

# minimum_master_nodes need to be explicitly set when bound on a public IP
# set to 1 to allow single node clusters
# because a single node is enough for CI build
# Details: https://github.com/elastic/elasticsearch/pull/17288
discovery.zen.minimum_master_nodes: 1

# Disable X-Packs Security
# because it requires BASE authentication which is redundant for test
# Details: https://www.elastic.co/guide/en/x-pack/current/security-settings.html#general-security-settings
xpack.security.enabled: false

# https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html#fielddata-size
# Place an upper limit to the fielddata cache to avoid OOM
indices.fielddata.cache.size: 40%
# Checks to see whether the query size is too large before data is loaded
indices.breaker.fielddata.limit: 50%

Dockerfileは、ベースはElasticsearch社が公式で提供しているDocker Imageを利用。 先ほど定義した独自のelasticsearch.yml設定ファイルを用いるようにしている。 今のところバージョンを変更するようなオプションは提供していないので、必要があればPRください。

# fixed the version to ~5.3
# because Amazon Elasticsearch Service supports until 5.3
# https://aws.amazon.com/elasticsearch-service/faqs/?nc1=h_ls
FROM docker.elastic.co/elasticsearch/elasticsearch:5.3.2

ADD elasticsearch.yml /usr/share/elasticsearch/config/

USER root
RUN chown elasticsearch:elasticsearch config/elasticsearch.yml

RUN elasticsearch-plugin install analysis-kuromoji

# elasticsearch cannot be executed by 'root' user for security reasons
# Details: https://discuss.elastic.co/t/why-is-it-elasticsearch-is-not-allowed-to-run-as-root/60413
USER elasticsearch