TestcontainersのElasticsearchコンテナ起動時にテストで必要となるプラグインをインストールする方法を調べてみました。
サンプルコード
ElasticsearchContainer
の親クラスのGenericContainer
が、docker-java API
のCreateContainerCmd
に対してなにか処理を追加できるwithCreateContainerCmdModifier
メソッドを提供してくれています。
このメソッドを使って、entrypoint
を設定することでプラグインのインストールが実現できます。
サンプルコードでは、analysis-kuromoji
インストール後にdocker-entrypoint.sh
を実行してElasticsearchを起動してみました。
import org.junit.jupiter.api.Test import org.testcontainers.elasticsearch.ElasticsearchContainer class ElasticSearchTest { val elasticsearchContainer = ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:7.11.1") .withCreateContainerCmdModifier { it.withEntrypoint("/bin/bash", "-c", "./bin/elasticsearch-plugin install analysis-kuromoji && docker-entrypoint.sh") } .withLabel("filter-label", "plugin-install-test") .withReuse(true) .apply { start() } @Test internal fun test() { val containerId = elasticsearchContainer.containerId println("containerId = ${containerId}") } }
pluginのインストール確認
withReuse
をtrue
にしているので、テスト終了後もコンテナが起動しっぱなしの状態となります。
そのコンテナ内に、入り込んでプラグインがインストールされていることを確認してみます。
docker ps --filter label=filter-label=plugin-install-test CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e705ae24a8a6 docker.elastic.co/elasticsearch/elasticsearch:7.11.1 "/bin/bash -c './bin…" 13 minutes ago Up 13 minutes 0.0.0.0:49259->9200/tcp, 0.0.0.0:49258->9300/tcp keen_gould ~ ❯ docker exec -it e705 bash [root@e705ae24a8a6 elasticsearch]# ./bin/elasticsearch-plugin list analysis-kuromoji
./bin/elasticsearch-plugin list
の結果、 analysis-kuromoji
が表示されたので想定通りプラグインがインストールされていますね!