やりたいこと
- 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
モードをもう少し深堀りすると, 以下のドキュメントにたどり着いた.
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 の公式掲示板は役に立つ.