docker run 時に Kuromoji をインストールして Elasticsearch を実行

下記のオフィシャルな Docker イメージだとプラグインが導入されておらず Kuromoji を使えません。

そこで、docker run 時に Kuromoji をインストールして Elasticsearch を実行してみました。

はじめに

Elasticsearch 8.0 がリリースされていますが、デフォルトで https 接続や認証が必須となっており多少面倒そうだったので、ここでは 7.17.0 を使う事にします。

なお、通常は以下のような Dockerfile を docker build して Kuromoji をインストールしたイメージを作成すれば済む話なのですが、ここではこの方法を使わず docker run 時のインストールを試します。

Dockerfile の例(Kuromoji をインストールした Elasticsearch イメージ作成)
FROM elasticsearch:7.17.0

RUN bin/elasticsearch-plugin install analysis-kuromoji

docker run 時の Kuromoji インストール

Elasticsearch 起動後に Kuromoji をインストールすると Elasticsearch の再起動が必要になってしまうので、Kuromoji のインストール後に Elasticsearch を起動させる必要があります。

とりあえずは、以下のように bash -c "bin/elasticsearch-plugin install analysis-kuromoji; docker-entrypoint.sh" コマンドを実行する事で実現できました。

docker run 実行例1

$ docker run -d --name sample1 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.17.0 bash -c "bin/elasticsearch-plugin install analysis-kuromoji; docker-entrypoint.sh"
確認例
$ curl -s http://localhost:9200/_cat/plugins
・・・ analysis-kuromoji 7.17.0

ただし、これだと docker start 時に毎回 Kuromoji のインストールを試みてエラーログを出力するのが気になります。

docker start 時のログ内容
$ docker stop sample1
$ docker start sample1
$ docker logs sample1
・・・
-> Failed installing analysis-kuromoji
-> Rolling back analysis-kuromoji
-> Rolled back analysis-kuromoji

ERROR: plugin directory [/usr/share/elasticsearch/plugins/analysis-kuromoji] already exists; if you need to update the plugin, uninstall it first using command 'remove analysis-kuromoji'
・・・

そこで、条件分岐(プラグインが空の場合にのみ Kuromoji をインストール)を加える事でこの問題を回避してみました。

docker run 実行例2(条件分岐の追加)

$ docker run -d --name sample2 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.17.0 bash -c "if [[ -z \$(bin/elasticsearch-plugin list) ]]; then bin/elasticsearch-plugin install analysis-kuromoji; fi; docker-entrypoint.sh"

なお、Windows PowerShell で実行する場合は、以下のように $エスケープするためにバッククォートを使う必要がありました。

PowerShell で実行する場合
> docker run -d --name sample2 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.17.0 bash -c "if [[ -z `$(bin/elasticsearch-plugin list) ]]; then bin/elasticsearch-plugin install analysis-kuromoji; fi; docker-entrypoint.sh"