kenju's blog

About Programming, Mathematics, Security and Blockchain

Circle CI 2.0 Beta で Elasticsearch Docker Image を動かす際の知見メモ

Elasticsearch社公式提供のDocker Image に接続できない

この記事(http://dev.classmethod.jp/server-side/elasticsearch/elastic-official-docker-image/ )に書いてあった。

まず、公式提供のDocker Imageは、デフォルトで X-Packs Securityをビルトインしてあるので、Basic Authenticationが必要。とりあえずログインしたいのであれば、公式ドキュメントにあるデフォルトパスワードを使って

# default passwords https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#_security_note
wget --waitretry=5 --retry-connrefused \
      --http-user=elastic --http-passwd=changeme \
      -v http://127.0.0.1:9200/ -O /dev/null

のようにすればいい。

Elastic社公式提供のDockerfileにX-Packsがビルトインされてて色々面倒

解決策としては、Elasticsearch社公式のDockerfileをほぼ参考に自前のDocker Imageを立ち上げることとした。

特に、X-Packs Securityが入っていると、ES立ち上げが面倒。テスト環境でシンプルに走らせたいだけなので、X-Packs Securityは不要。

以下の部分で X-Packs をインストールしているので、自前のDockerfile からは以下の行を削除するかコメントアウトするかで対処。

# Install xpack
RUN eval ${ES_JAVA_OPTS:-} elasticsearch-plugin install --batch x-pack

なお、X-Packs Security のみを向こうにしたいだけなら、

xpack.security.enabled: false

としてもよい。

CI上でのみERROR: bootstrap checks failed でESが落ちる

Elasticsearch社公式提供のDocker Image は、前述の通り X-Packsをビルトインしている。この中に、Bootstrap Checks という、ESが支障なく動作できる環境かどうかをチェックする機構が組み込まれている。

で、ESがインデックスを保存するときに使うメモリマップ なるものの最大数の設定値、 vm.max_map_count が、一定数以上であることをシステムに求めるのだが、Circle CI上ではこれを変更できないため、公式Docker Imageのインストールの時点で落ちてしまう。

https://discuss.circleci.com/t/running-elasticsearch-5/8559/7 を見ると、対応策が述べられている。以下を設定ファイルに付与すればよい。

bootstrap.system_call_filter: false
transport.host: localhost

なお、macOS で DockerのVMオプションを変更するには、Dockerを動かしている xhyve vmにログインして以下のようにするらしい。ローカルでも同じ現象を再現したい場合は必要。

$ screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
# sysctl -w vm.max_map_count=262144