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"