ようへいの日々精進XP

よかろうもん

【俺の一行チップス】Elasticsearch 6.x の Docker イメージにプラグインをインストールして docker-compose で Elasticsearch 環境を構築したい

やりたいこと

  • Elasticsearch 6.x の Docker イメージを利用したい
  • docker build の途中で Elasticsearch プラグインをインストール docker-compose で Elasticsearch 環境を構築したい

やったこと

以下のような Dockerfile を用意. Dockerfile 名は Dockerfile.elasticsearch にしてみた.

FROM docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.6
RUN bin/elasticsearch-plugin install --batch repository-s3

インストールしたい Elasticsearch プラグインはスナップショットを S3 に保存するプラグイン repository-s3 を.

以下のような docker-compose.yml を用意.

version: '3.7'

services:
  elasticsearch:
    build:
      context: .
      dockerfile: Dockerfile.elasticsearch
    container_name: elasticsearch
    environment:
      cluster.name: docker-cluster
      ES_JAVA_OPTS: "-Xms128m -Xmx128m"
      bootstrap.system_call_filter: "false"
      transport.host: localhost
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200

後は docker-compose build elasticsearch を実行するだけ. コンテナが起動したら, 以下のようにインストール済みのプラグインを確認する.

$ curl -s 'localhost:9200/_nodes?filter_path=nodes.*.plugins' | jq .
{
  "nodes": {
    "4Lf-rIhpTvq0b16LTYSLHA": {
      "plugins": [
        {
          "name": "repository-s3",
          "version": "6.8.6",
          "elasticsearch_version": "6.8.6",
          "java_version": "1.8",
          "description": "The S3 repository plugin adds S3 repositories",
          "classname": "org.elasticsearch.repositories.s3.S3RepositoryPlugin",
          "extended_plugins": [],
          "has_native_controller": false
        }
      ]
    }
  }
}

おつかれさんでした.

ハマった

当初は Dockerfile 内の repository-s3 インストール部分を以下のように書いていた.

RUN bin/elasticsearch-plugin install repository-s3

ところが, 以下のようなエラーとなってしまっていた.

Exception in thread "main" java.lang.IllegalStateException: unable to read from standard input; is standard input open and a tty attached?
        at org.elasticsearch.cli.Terminal$SystemTerminal.readText(Terminal.java:173)
        at org.elasticsearch.plugins.PluginSecurity.prompt(PluginSecurity.java:74)
        at org.elasticsearch.plugins.PluginSecurity.confirmPolicyExceptions(PluginSecurity.java:67)
        at org.elasticsearch.plugins.InstallPluginCommand.installPlugin(InstallPluginCommand.java:812)
        at org.elasticsearch.plugins.InstallPluginCommand.install(InstallPluginCommand.java:786)
        at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:232)
        at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:217)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
        at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:77)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
        at org.elasticsearch.cli.Command.main(Command.java:90)
        at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)
ERROR: Service 'elasticsearch' failed to build: The command '/bin/sh -c bin/elasticsearch-plugin install repository-s3' returned a non-zero code: 1

Elasticsearch の公式掲示板を見ていたところ, 以下の投稿が全く同じ内容だったので参考にして bin/elasticsearch-plugin-batch オプションを指定した.

実際に elasticsearch-plugin コマンドの install サブコマンドのオプションを確認してみる.

$ docker-compose exec elasticsearch bin/elasticsearch-plugin install --help
... 略 ...
Non-option arguments:
plugin id

Option             Description
------             -----------
-E <KeyValuePair>  Configure a setting
-b, --batch        Enable batch mode explicitly, automatic confirmation of
                     security permission
-h, --help         show help
-s, --silent       show minimal output
-v, --verbose      show verbose output

確かに, --batch オプションあるようですな. --batch モードをもう少し深堀りすると, 以下のドキュメントにたどり着いた.

github.com

Certain plugins require more privileges than those provided by default in core Elasticsearch. These plugins will list the required privileges and ask the user for confirmation before continuing with installation.

特定のプラグインでは特権が必要になる為, インストールのタイミングでインタラクティブに特権の付与を設定したりする必要があるけど, --batch オプションを付与すると, プラグインが確認応答をスキップして要求する特権を全て付与してプラグインをインストールするらしい. ふむふむ. 実際に --batch オプションを付与してインストールした際には以下のように出力された.

... 略 ...
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.lang.RuntimePermission accessDeclaredMembers
* java.lang.RuntimePermission getClassLoader
* java.lang.reflect.ReflectPermission suppressAccessChecks
* java.net.SocketPermission * connect,resolve
* java.util.PropertyPermission es.allow_insecure_settings read,write
... 略 ...

参考

相変わらず, Elasticsearch の公式掲示板は役に立つ.