ElasticsearchのDockerイメージにプラグインを入れたいけど、自分でイメージを作りたくない人向け
はじめに
Elastic stackをお試しするのにDockerが手軽なので、Dockerでやろうという人は多いかと思います。
しかし、日本語用のAnalyzerであるプラグインanalysis-kuromojiを入れるためだけに、自分でDockerfileを書いて、オリジナルのDockerイメージを作りたくはありません。
たとえば、こういうことはしたくないのです。
FROM docker.elastic.co/elasticsearch/elasticsearch:6.5.4 RUN elasticsearch-plugin install 何かのプラグイン
- 理由その1
Build Argsがあるとはいえ、ベースのElastic stackのバージョンが増えるたびに、docker buildするのも面倒です。
- 理由その2
入れたいプラグインが変わったら、そのたびごとにイメージを作り直すのは面倒だから
- 理由その3
なるべくオリジナルのものをそのまま使いたい。
アプローチ
規定では、Dockerコンテナ起動時には、entrypointに、docker-entry.shが設定されており、そこでElasticsearchを起動するようになっています。
このままではプラグインをインストールしたあと、
プラグインを有効化するために、Elasticsearchを再起動する必要があります。
二度手間なので、docker-entry.shが実行される前にプラグインを入れてしまうようにしたいです。
どうやるか
規定で、dockerのentrypointに指定されているdocker-entry.shが実行される前に、プラグインインストール用コマンドが実行されるようにentrypointを書き換えてしまいます。
version: '2' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:6.5.4 container_name: elasticsearch environment: - cluster.name=docker-cluster - bootstrap.memory_lock=true ulimits: memlock: soft: -1 hard: -1 volumes: - esdata:/usr/share/elasticsearch/data - ./install-plugin.sh:/tmp/install-plugin.sh ports: - 9200:9200 networks: - esnet entrypoint: > bash -c "chmod +x /tmp/install-plugin.sh && /tmp/install-plugin.sh analysis-kuromoji && /tmp/install-plugin.sh repository-s3 && docker-entrypoint.sh" kibana: image: docker.elastic.co/kibana/kibana:6.5.4 container_name: kibana ports: - 5601:5601 depends_on: - elasticsearch links: - elasticsearch:elasticsearch networks: - esnet volumes: esdata: driver: local networks: esnet:
プラグインインストール用のshを配置
プラグインのインストールコマンド(elasticsearch-plugin install)をするだけのシェルですが、インストール済みの環境にインストールしようとすると、 コマンドがエラーを返すため、既に入ってるかを確認し、入ってなければインストールするようにしました。
bashを && でつながずに || でやれば良いという考え方もありそうだと後になって気づきました。
entrypointの書き換え
規定のdocker-entry.shが実行される前に、プラグインインストール用のコマンドを差し込んでみます。
entrypoint: > bash -c "chmod +x /tmp/install-plugin.sh && /tmp/install-plugin.sh analysis-kuromoji && /tmp/install-plugin.sh repository-s3 && docker-entrypoint.sh"
ここでは、例としてkuromojiとスナップショットなどをs3におけるプラグインを2つ指定してみました。
/tmp/install-plugin.sh <プラグイン名>
で指定する形です。
これでコンテナを起動すると
こんな感じで起動し・・・
指定したプラグインが入った状態で起動していることが確認できました。
まとめ
様々な用途でDockerをいろいろ便利にお使いになられている方は多いと思いますが、 オリジナルのイメージを最大に利用する、という観点で参考になれば。
では、また。