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を再起動する必要があります。

f:id:tsgkdt:20190103214125p:plain
default

二度手間なので、docker-entry.shが実行される前にプラグインを入れてしまうようにしたいです。

f:id:tsgkdt:20190103214307p:plain
tobe

どうやるか

規定で、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)をするだけのシェルですが、インストール済みの環境にインストールしようとすると、 コマンドがエラーを返すため、既に入ってるかを確認し、入ってなければインストールするようにしました。

elasticsearch-install-plugin/install-plugin.sh at master · tsgkdt/elasticsearch-install-plugin · GitHub

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 <プラグイン名>

で指定する形です。

これでコンテナを起動すると

f:id:tsgkdt:20190103215535p:plain
initialize

こんな感じで起動し・・・

f:id:tsgkdt:20190103215644p:plain
kibana

指定したプラグインが入った状態で起動していることが確認できました。

まとめ

様々な用途でDockerをいろいろ便利にお使いになられている方は多いと思いますが、 オリジナルのイメージを最大に利用する、という観点で参考になれば。

では、また。