OpenShiftに乗っける前段としてDockerでFessを入れようと奮闘しています(笑)

# はじめに

全文検索に対応する必要性が出てきそうな予感があり
FessをOpenShiftに導入したいなと思っています。

その前段としてFessやElasticsearchがどんなものかDockerで作ってみようってのが話の始まり

OpenShiftにDockerHubからイメージを自由に落とせる環境ではないため、手順に従いインストールして構築する方法を模索していますが、今のところうまく行っていません。

ちなみにわたしJavaは判りません(笑)


# 環境
- Docker for Windows
- [Elasticsearch:7.3.2](https://www.elastic.co/jp/downloads/elasticsearch)
- [Fess:13.3.1](https://github.com/codelibs/fess/releases)
- [OpenJDK11](https://adoptopenjdk.net/releases.html?variant=openjdk11&jvmVariant=hotspot#x64_linux)([AdoptOpenJDK](https://adoptopenjdk.net/index.html))

# 下準備(docker-compose)
[Fessのインストールマニュアル](https://fess.codelibs.org/ja/13.3/install/install.html)だよりに色々進めていますが、なんともうまくインストールできていません。

とりあえず作成したdocker-compose.yamlとDockerfile達はこんな感じです。

まずはディレクトリ構成

```text
├─ ubuntu/
　　　├─ elasticsearch/
　　　│　　│─ fess_plugins
　　　│　　│─ docker-entrypoint.sh
　　　│　　│─ Dockerfile
　　　│　　│─ elasticsearch-7.3.2-amd64.deb
　　　│　　└─ OpenJDK11U-jdk_x64_linux_hotspot_11.0.4_11.tar.gz
　　　├─ fess/
　　　│　　│─ Dockerfile
　　　│　　│─ fess-13.3.1.deb
　　　│　　└─ OpenJDK11U-jdk_x64_linux_hotspot_11.0.4_11.tar.gz
　　　├─ docker-compose.yaml
```

- `fess_plugins`は、fessをインストールしたパッケージディレクトリの`/usr/share/fess/es/plugins`をコピーしています。
- `docker-entorypoint.sh`は、elasticsearch:7.3.2からパチって来たものになります。

```yaml:ubuntu/docker-compose.yaml
version: '3.7'

services:
  fess:
    container_name: fess_fess
    build: ./fess/
    image: fess:13.3.1
    restart: always
    ports:
      - 8080:8080
    environment:
      - ES_HTTP_URL=http://elasticsearch:9200
      - ES_TRANSPORT_URL=elasticsearch:9300
      - FESS_DICTIONARY_PATH=/etc/elasticsearch/
      - FESS_CONF_PATH=/etc/fess/
    links:
      - elasticsearch
    depends_on: 
      - elasticsearch

  elasticsearch:
    container_name: fess_elasticsearch
    build: ./elasticsearch/
    image: elasticsearch:7.3.2
    restart: always
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9300:9300

volumes:
  esdata01:
    driver: local
```

```docker:ubuntu/elasticsearch/Dockerfile
FROM ubuntu:latest

ENV DEBIAN_FRONTEND=noninteractive \
    PATH=$PATH:/usr/local/java/bin \
    JAVA_HOME=/usr/local/java \
    ES_HOME=/usr/share/elasticsearch \
    ES_VERSION=7.3.2

# setup TIME_ZONE
RUN ln -sf /usr/share/zoneinfo/Japan /etc/localtime

# update system and install required software packages
RUN apt-get -y update
RUN apt-get -y install apt-transport-https
RUN apt-get -y autoremove && \
    apt-get -y clean

# install openjdk-12
COPY ./OpenJDK11U-jdk_x64_linux_hotspot_11.0.4_11.tar.gz /usr/local/src/
RUN cd /usr/local && \
    tar zxvf src/OpenJDK11U-jdk_x64_linux_hotspot_11.0.4_11.tar.gz && \
    rm -rf jdk-11.0.4+11/demo && \
    ln -s jdk-11.0.4+11 java

# set PATH and JAVA_HOME
RUN echo "export PATH=$PATH:/usr/local/java/bin" > /etc/profile.d/00-java.sh && \
    echo "export JAVA_HOME=/usr/local/java" >> /etc/profile.d/00-java.sh

# install elasticsearch
COPY ./elasticsearch-${ES_VERSION}-amd64.deb /usr/local/src/elasticsearch-${ES_VERSION}-amd64.deb
RUN dpkg -i /usr/local/src/elasticsearch-${ES_VERSION}-amd64.deb
COPY ./docker-entrypoint.sh /usr/share/elasticsearch/bin/docker-entrypoint.sh

# install elasticsearch plugins
COPY ./fess_plugins/analysis-extension /usr/share/elasticsearch/plugins/analysis-extension
COPY ./fess_plugins/analysis-fess /usr/share/elasticsearch/plugins/analysis-fess
COPY ./fess_plugins/configsync /usr/share/elasticsearch/plugins/configsync
COPY ./fess_plugins/dataformat /usr/share/elasticsearch/plugins/dataformat
COPY ./fess_plugins/minhash /usr/share/elasticsearch/plugins/minhash

EXPOSE 9200 9300

# elasticsearch settings
RUN sed -i -e "s/^#network\.host.*/network\.host: elasticsearch/g" /etc/elasticsearch/elasticsearch.yml && \
    sed -i -e "s/^#http\.port.*/http\.port: 9200/g" /etc/elasticsearch/elasticsearch.yml
RUN echo "configsync.config_path: /var/lib/elasticsearch/config" >> /etc/elasticsearch/elasticsearch.yml

USER elasticsearch
WORKDIR ${ES_HOME}

#RUN elasticsearch
ENV discovery.type=single-node
CMD ["./bin/docker-entrypoint.sh"]
```

```docker:ubuntu/fess/Dockerfile
FROM ubuntu:latest

ENV DEBIAN_FRONTEND=noninteractive \
    PATH=$PATH:/usr/local/java/bin \
    JAVA_HOME=/usr/local/java \
    FESS_HOME=/usr/share/fess \
    FESS_CONF_PATH=/etc/fess \
    FESS_CLASSPATH=${FESS_HOME}/lib \
    fess.log.path=/var/log/fess

# setup TIME_ZONE
RUN ln -sf /usr/share/zoneinfo/Japan /etc/localtime

# update system and install required software packages
RUN apt-get -y update
RUN apt-get -y autoremove && \
    apt-get -y clean

# install openjdk-12
COPY ./OpenJDK11U-jdk_x64_linux_hotspot_11.0.4_11.tar.gz /usr/local/src/
RUN cd /usr/local && \
    tar zxvf src/OpenJDK11U-jdk_x64_linux_hotspot_11.0.4_11.tar.gz && \
    rm -rf jdk-11.0.4+11/demo && \
    ln -s jdk-11.0.4+11 java

# set PATH and JAVA_HOME
RUN echo "export PATH=$PATH:/usr/local/java/bin" > /etc/profile.d/00-java.sh && \
    echo "export JAVA_HOME=/usr/local/java" >> /etc/profile.d/00-java.sh

# install Fess
COPY ./fess-13.3.1.deb /usr/local/src/fess-13.3.1.deb
RUN dpkg -i /usr/local/src/fess-13.3.1.deb 

# configure
RUN sed -i -e "s/localhost:9201/elasticsearch:9200/" ${FESS_CONF_PATH}/fess_config.properties && \
    sed -i -e "s/#tomcat.bindAddress=127\.0\.0\.1/tomcat.bindAddress=fess/g" ${FESS_CONF_PATH}/tomcat_config.properties && \
    sed -i -e "s/^#ES_HTTP_URL=http:\/\/localhost:9200/ES_HTTP_URL=http:\/\/elasticsearch:9200/g" ${FESS_HOME}/bin/fess.in.sh && \
    sed -i -e "s/^#FESS_DICTIONARY_PATH=\/var\/lib\/elasticsearch\/config\//FESS_DICTIONARY_PATH=\/var\/lib\/elasticsearch\/config\//g" ${FESS_HOME}/bin/fess.in.sh

EXPOSE 8080

RUN mkdir /usr/share/fess/logs && \
    chmod go+w /usr/share/fess/logs

WORKDIR ${FESS_HOME}
CMD [ "./bin/fess" ]
```

```bash:ubuntu/elasticsearch/docker-entorypoint.sh
#!/bin/bash
set -e

# Files created by Elasticsearch should always be group writable too
umask 0002

run_as_other_user_if_needed() {
  if [[ "$(id -u)" == "0" ]]; then
    # If running as root, drop to specified UID and run command
    exec chroot --userspec=1000 / "${@}"
  else
    # Either we are running in Openshift with random uid and are a member of the root group
    # or with a custom --user
    exec "${@}"
  fi
}

# Allow user specify custom CMD, maybe bin/elasticsearch itself
# for example to directly specify `-E` style parameters for elasticsearch on k8s
# or simply to run /bin/bash to check the image
if [[ "$1" != "eswrapper" ]]; then
  if [[ "$(id -u)" == "0" && $(basename "$1") == "elasticsearch" ]]; then
    # centos:7 chroot doesn't have the `--skip-chdir` option and
    # changes our CWD.
    # Rewrite CMD args to replace $1 with `elasticsearch` explicitly,
    # so that we are backwards compatible with the docs
    # from the previous Elasticsearch versions<6
    # and configuration option D:
    # https://www.elastic.co/guide/en/elasticsearch/reference/5.6/docker.html#_d_override_the_image_8217_s_default_ulink_url_https_docs_docker_com_engine_reference_run_cmd_default_command_or_options_cmd_ulink
    # Without this, user could specify `elasticsearch -E x.y=z` but
    # `bin/elasticsearch -E x.y=z` would not work.
    set -- "elasticsearch" "${@:2}"
    # Use chroot to switch to UID 1000
    exec chroot --userspec=1000 / "$@"
  else
    # User probably wants to run something else, like /bin/bash, with another uid forced (Openshift?)
    exec "$@"
  fi
fi

# Parse Docker env vars to customize Elasticsearch
#
# e.g. Setting the env var cluster.name=testcluster
#
# will cause Elasticsearch to be invoked with -Ecluster.name=testcluster
#
# see https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html#_setting_default_settings

declare -a es_opts

while IFS='=' read -r envvar_key envvar_value
do
  # Elasticsearch settings need to have at least two dot separated lowercase
  # words, e.g. `cluster.name`, except for `processors` which we handle
  # specially
  if [[ "$envvar_key" =~ ^[a-z0-9_]+\.[a-z0-9_]+ || "$envvar_key" == "processors" ]]; then
    if [[ ! -z $envvar_value ]]; then
      es_opt="-E${envvar_key}=${envvar_value}"
      es_opts+=("${es_opt}")
    fi
  fi
done < <(env)

# The virtual file /proc/self/cgroup should list the current cgroup
# membership. For each hierarchy, you can follow the cgroup path from
# this file to the cgroup filesystem (usually /sys/fs/cgroup/) and
# introspect the statistics for the cgroup for the given
# hierarchy. Alas, Docker breaks this by mounting the container
# statistics at the root while leaving the cgroup paths as the actual
# paths. Therefore, Elasticsearch provides a mechanism to override
# reading the cgroup path from /proc/self/cgroup and instead uses the
# cgroup path defined the JVM system property
# es.cgroups.hierarchy.override. Therefore, we set this value here so
# that cgroup statistics are available for the container this process
# will run in.
export ES_JAVA_OPTS="-Des.cgroups.hierarchy.override=/ $ES_JAVA_OPTS"

if [[ -f bin/elasticsearch-users ]]; then
  # Check for the ELASTIC_PASSWORD environment variable to set the
  # bootstrap password for Security.
  #
  # This is only required for the first node in a cluster with Security
  # enabled, but we have no way of knowing which node we are yet. We'll just
  # honor the variable if it's present.
  if [[ -n "$ELASTIC_PASSWORD" ]]; then
    [[ -f /usr/share/elasticsearch/config/elasticsearch.keystore ]] || (run_as_other_user_if_needed elasticsearch-keystore create)
    if ! (run_as_other_user_if_needed elasticsearch-keystore list | grep -q '^bootstrap.password$'); then
      (run_as_other_user_if_needed echo "$ELASTIC_PASSWORD" | elasticsearch-keystore add -x 'bootstrap.password')
    fi
  fi
fi

if [[ "$(id -u)" == "0" ]]; then
  # If requested and running as root, mutate the ownership of bind-mounts
  if [[ -n "$TAKE_FILE_OWNERSHIP" ]]; then
    chown -R 1000:0 /usr/share/elasticsearch/{data,logs}
  fi
fi

run_as_other_user_if_needed /usr/share/elasticsearch/bin/elasticsearch "${es_opts[@]}"
```

```config:ubuntu/elasticsearch/fess_plugins/*/plugin-descriptor.properties
:
elasticsearch.version=7.3.2
java.version=1.11
```

# 困りごと#1

## エラー内容：java.lang.NoClassDefFoundError: com/google/common/hash/HashFunction
- elasticsearchにfessのプラグインをインストールする際にエラーが発生。よって依存するfessが動作しない。`com/google/common/hash/HashFunction`がUnDefinedだって言われている。因みにfessのPluginsをインストール(COPY)しなければelasticsearchは起動する。


```console
fess_elasticsearch | [2019-09-23T11:25:03,575][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [f5d6d263c256] fatal error in thread [elasticsearch[f5d6d263c256][masterService#updateTask][T#1]], exiting
fess_elasticsearch | java.lang.NoClassDefFoundError: com/google/common/hash/HashFunction
fess_elasticsearch |    at org.codelibs.minhash.MinHash.createHashFunctions(MinHash.java:107) ~[?:?]
fess_elasticsearch |    at org.codelibs.elasticsearch.minhash.index.analysis.MinHashTokenFilterFactory.<init>(MinHashTokenFilterFactory.java:26) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.index.analysis.AnalysisRegistry.buildMapping(AnalysisRegistry.java:447) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.index.analysis.AnalysisRegistry.buildTokenFilterFactories(AnalysisRegistry.java:282) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.index.analysis.AnalysisRegistry.build(AnalysisRegistry.java:213) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.index.IndexService.<init>(IndexService.java:180) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.index.IndexModule.newIndexService(IndexModule.java:411) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.indices.IndicesService.createIndexService(IndicesService.java:563) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.indices.IndicesService.createIndex(IndicesService.java:512) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.cluster.metadata.MetaDataIndexTemplateService.validateAndAddTemplate(MetaDataIndexTemplateService.java:235) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.cluster.metadata.MetaDataIndexTemplateService.access$300(MetaDataIndexTemplateService.java:65)
~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.cluster.metadata.MetaDataIndexTemplateService$2.execute(MetaDataIndexTemplateService.java:176)
~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.cluster.ClusterStateUpdateTask.execute(ClusterStateUpdateTask.java:47) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.cluster.service.MasterService.executeTasks(MasterService.java:687) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.cluster.service.MasterService.calculateTaskOutputs(MasterService.java:310) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.cluster.service.MasterService.runTasks(MasterService.java:210) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.cluster.service.MasterService$Batcher.run(MasterService.java:142) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.cluster.service.TaskBatcher.runIfNotProcessed(TaskBatcher.java:150) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.cluster.service.TaskBatcher$BatchedTask.run(TaskBatcher.java:188) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:688) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:252) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:215) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
fess_elasticsearch |    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
fess_elasticsearch |    at java.lang.Thread.run(Thread.java:834) [?:?]
fess_elasticsearch | Caused by: java.lang.ClassNotFoundException: com.google.common.hash.HashFunction
fess_elasticsearch |    at java.net.URLClassLoader.findClass(URLClassLoader.java:471) ~[?:?]
fess_elasticsearch |    at java.lang.ClassLoader.loadClass(ClassLoader.java:588) ~[?:?]
fess_elasticsearch |    at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:899) ~[?:?]
fess_elasticsearch |    at java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[?:?]
fess_elasticsearch |    ... 25 more
```

## エラー回避：java.lang.NoClassDefFoundError: com/google/common/hash/HashFunction
`minhash.jar`で`com/google/common/hash/HashFunction`が無いと怒られているとのことなので入手します(笑)
[https://github.com/google/guava/wiki/Release23](https://github.com/google/guava/wiki/Release23)　より　Guavaのjarをダウンロードします。
http://search.maven.org/remotecontent?filepath=com/google/guava/guava/23.0/guava-23.0.jar

こいつをとりあえず`minhash.jar`のある`fess_plugins/minhash`フォルダにぶち込みます。

# 困りごと#2
上記で`minhash`のエラーは出なくなりましたが次なる問題が発覚

## エラー内容：java.lang.Exception: java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64

こんどは`ConfigSyncService`で`org.apache.commons.codec.binary.Base64`が無いんやって…

```console
fess_elasticsearch | [2019-09-23T12:31:02,223][INFO ][o.c.e.c.s.ConfigSyncService] [caa90b0e6f11] ConfigFileUpdater is started at 1m intervals.
fess_elasticsearch | [2019-09-23T12:31:02,632][ERROR][o.e.ExceptionsHelper     ] [caa90b0e6f11] fatal error
fess_elasticsearch |    at org.elasticsearch.ExceptionsHelper.lambda$maybeDieOnAnotherThread$4(ExceptionsHelper.java:300)
fess_elasticsearch |    at java.base/java.util.Optional.ifPresent(Optional.java:183)
fess_elasticsearch |    at org.elasticsearch.ExceptionsHelper.maybeDieOnAnotherThread(ExceptionsHelper.java:290)
fess_elasticsearch |    at org.elasticsearch.http.netty4.Netty4HttpRequestHandler.exceptionCaught(Netty4HttpRequestHandler.java:76)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:297)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.notifyHandlerException(AbstractChannelHandlerContext.java:831)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:376)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
fess_elasticsearch |    at org.elasticsearch.http.netty4.Netty4HttpPipeliningHandler.channelRead(Netty4HttpPipeliningHandler.java:58)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
fess_elasticsearch |    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323)
fess_elasticsearch |    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
fess_elasticsearch |    at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:287)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
fess_elasticsearch |    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
fess_elasticsearch |    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)
fess_elasticsearch |    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:682)
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:582)
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:536)
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
fess_elasticsearch |    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
fess_elasticsearch |    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
fess_elasticsearch |    at java.base/java.lang.Thread.run(Thread.java:834)
fess_elasticsearch | [2019-09-23T12:31:02,701][WARN ][o.e.h.AbstractHttpServerTransport] [caa90b0e6f11] caught exception while handling client http traffic, closing connection Netty4HttpChannel{localAddress=/172.22.0.3:9200, remoteAddress=/172.22.0.2:43508}
fess_elasticsearch | java.lang.Exception: java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64
fess_elasticsearch |    at org.elasticsearch.http.netty4.Netty4HttpRequestHandler.exceptionCaught(Netty4HttpRequestHandler.java:79) [transport-netty4-client-7.3.2.jar:7.3.2]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:297) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.notifyHandlerException(AbstractChannelHandlerContext.java:831) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:376) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at org.elasticsearch.http.netty4.Netty4HttpPipeliningHandler.channelRead(Netty4HttpPipeliningHandler.java:58) [transport-netty4-client-7.3.2.jar:7.3.2]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [netty-codec-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) [netty-codec-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [netty-codec-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [netty-codec-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323) [netty-codec-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297) [netty-codec-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:287) [netty-handler-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:682) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:582) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:536) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906) [netty-common-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-common-4.1.36.Final.jar:4.1.36.Final]
fess_elasticsearch |    at java.lang.Thread.run(Thread.java:834) [?:?]
fess_elasticsearch | Caused by: java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.getId(ConfigSyncService.java:353) ~[?:?]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.lambda$store$13(ConfigSyncService.java:313) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.lambda$checkIfIndexExists$9(ConfigSyncService.java:261) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$1.onResponse(TransportAction.java:68) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$1.onResponse(TransportAction.java:64) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.ActionListener$2.onResponse(ActionListener.java:88) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.admin.indices.exists.indices.TransportIndicesExistsAction.masterOperation(TransportIndicesExistsAction.java:80) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.admin.indices.exists.indices.TransportIndicesExistsAction.masterOperation(TransportIndicesExistsAction.java:39) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction.masterOperation(TransportMasterNodeAction.java:127) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction$1.doRun(TransportMasterNodeAction.java:200) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.common.util.concurrent.EsExecutors$DirectExecutorService.execute(EsExecutors.java:193) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction.doStart(TransportMasterNodeAction.java:197) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction.start(TransportMasterNodeAction.java:161) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction.doExecute(TransportMasterNodeAction.java:138) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction.doExecute(TransportMasterNodeAction.java:58) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$RequestFilterChain.proceed(TransportAction.java:145) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.xpack.security.action.filter.SecurityActionFilter.apply(SecurityActionFilter.java:123) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$RequestFilterChain.proceed(TransportAction.java:143) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:121) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:64) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.node.NodeClient.executeLocally(NodeClient.java:83) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.node.NodeClient.doExecute(NodeClient.java:72) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:392) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.support.AbstractClient$IndicesAdmin.execute(AbstractClient.java:1212) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:70) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.checkIfIndexExists(ConfigSyncService.java:256) ~[?:?]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.store(ConfigSyncService.java:311) ~[?:?]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.rest.RestConfigSyncFileAction.lambda$prepareRequest$8(RestConfigSyncFileAction.java:102) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.rest.BaseRestHandler.handleRequest(BaseRestHandler.java:113) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.xpack.security.rest.SecurityRestFilter.handleRequest(SecurityRestFilter.java:69) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.rest.RestController.dispatchRequest(RestController.java:240) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.rest.RestController.tryAllHandlers(RestController.java:344) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.rest.RestController.dispatchRequest(RestController.java:174) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.AbstractHttpServerTransport.dispatchRequest(AbstractHttpServerTransport.java:320) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.AbstractHttpServerTransport.handleIncomingRequest(AbstractHttpServerTransport.java:370) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.AbstractHttpServerTransport.incomingRequest(AbstractHttpServerTransport.java:299) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.netty4.Netty4HttpRequestHandler.channelRead0(Netty4HttpRequestHandler.java:66) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.http.netty4.Netty4HttpRequestHandler.channelRead0(Netty4HttpRequestHandler.java:31) ~[?:?]
fess_elasticsearch |    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[?:?]
fess_elasticsearch |    ... 40 more
fess_elasticsearch | Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.binary.Base64
fess_elasticsearch |    at java.net.URLClassLoader.findClass(URLClassLoader.java:471) ~[?:?]
fess_elasticsearch |    at java.lang.ClassLoader.loadClass(ClassLoader.java:588) ~[?:?]
fess_elasticsearch |    at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:899) ~[?:?]
fess_elasticsearch |    at java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[?:?]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.getId(ConfigSyncService.java:353) ~[?:?]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.lambda$store$13(ConfigSyncService.java:313) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.lambda$checkIfIndexExists$9(ConfigSyncService.java:261) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$1.onResponse(TransportAction.java:68) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$1.onResponse(TransportAction.java:64) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.ActionListener$2.onResponse(ActionListener.java:88) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.admin.indices.exists.indices.TransportIndicesExistsAction.masterOperation(TransportIndicesExistsAction.java:80) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.admin.indices.exists.indices.TransportIndicesExistsAction.masterOperation(TransportIndicesExistsAction.java:39) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction.masterOperation(TransportMasterNodeAction.java:127) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction$1.doRun(TransportMasterNodeAction.java:200) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.common.util.concurrent.EsExecutors$DirectExecutorService.execute(EsExecutors.java:193) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction.doStart(TransportMasterNodeAction.java:197) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction.start(TransportMasterNodeAction.java:161) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction.doExecute(TransportMasterNodeAction.java:138) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction.doExecute(TransportMasterNodeAction.java:58) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$RequestFilterChain.proceed(TransportAction.java:145) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.xpack.security.action.filter.SecurityActionFilter.apply(SecurityActionFilter.java:123) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$RequestFilterChain.proceed(TransportAction.java:143) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:121) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:64) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.node.NodeClient.executeLocally(NodeClient.java:83) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.node.NodeClient.doExecute(NodeClient.java:72) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:392) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.support.AbstractClient$IndicesAdmin.execute(AbstractClient.java:1212) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:70) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.checkIfIndexExists(ConfigSyncService.java:256) ~[?:?]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.store(ConfigSyncService.java:311) ~[?:?]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.rest.RestConfigSyncFileAction.lambda$prepareRequest$8(RestConfigSyncFileAction.java:102) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.rest.BaseRestHandler.handleRequest(BaseRestHandler.java:113) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.xpack.security.rest.SecurityRestFilter.handleRequest(SecurityRestFilter.java:69) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.rest.RestController.dispatchRequest(RestController.java:240) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.rest.RestController.tryAllHandlers(RestController.java:344) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.rest.RestController.dispatchRequest(RestController.java:174) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.AbstractHttpServerTransport.dispatchRequest(AbstractHttpServerTransport.java:320) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.AbstractHttpServerTransport.handleIncomingRequest(AbstractHttpServerTransport.java:370) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.AbstractHttpServerTransport.incomingRequest(AbstractHttpServerTransport.java:299) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.netty4.Netty4HttpRequestHandler.channelRead0(Netty4HttpRequestHandler.java:66) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.http.netty4.Netty4HttpRequestHandler.channelRead0(Netty4HttpRequestHandler.java:31) ~[?:?]
fess_elasticsearch |    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[?:?]
fess_elasticsearch |    ... 40 more
fess_elasticsearch | [2019-09-23T12:31:02,684][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [caa90b0e6f11] fatal error in thread [Thread-3], exiting
fess_elasticsearch | java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.getId(ConfigSyncService.java:353) ~[?:?]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.lambda$store$13(ConfigSyncService.java:313) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.lambda$checkIfIndexExists$9(ConfigSyncService.java:261) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$1.onResponse(TransportAction.java:68) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$1.onResponse(TransportAction.java:64) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.ActionListener$2.onResponse(ActionListener.java:88) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.admin.indices.exists.indices.TransportIndicesExistsAction.masterOperation(TransportIndicesExistsAction.java:80) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.admin.indices.exists.indices.TransportIndicesExistsAction.masterOperation(TransportIndicesExistsAction.java:39) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction.masterOperation(TransportMasterNodeAction.java:127) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction$1.doRun(TransportMasterNodeAction.java:200) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.common.util.concurrent.EsExecutors$DirectExecutorService.execute(EsExecutors.java:193) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction.doStart(TransportMasterNodeAction.java:197) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction.start(TransportMasterNodeAction.java:161) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction.doExecute(TransportMasterNodeAction.java:138) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.master.TransportMasterNodeAction.doExecute(TransportMasterNodeAction.java:58) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$RequestFilterChain.proceed(TransportAction.java:145) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.xpack.security.action.filter.SecurityActionFilter.apply(SecurityActionFilter.java:123) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction$RequestFilterChain.proceed(TransportAction.java:143) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:121) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:64) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.node.NodeClient.executeLocally(NodeClient.java:83) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.node.NodeClient.doExecute(NodeClient.java:72) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:392) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.client.support.AbstractClient$IndicesAdmin.execute(AbstractClient.java:1212) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:70) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.checkIfIndexExists(ConfigSyncService.java:256) ~[?:?]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.service.ConfigSyncService.store(ConfigSyncService.java:311) ~[?:?]
fess_elasticsearch |    at org.codelibs.elasticsearch.configsync.rest.RestConfigSyncFileAction.lambda$prepareRequest$8(RestConfigSyncFileAction.java:102) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.rest.BaseRestHandler.handleRequest(BaseRestHandler.java:113) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.xpack.security.rest.SecurityRestFilter.handleRequest(SecurityRestFilter.java:69) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.rest.RestController.dispatchRequest(RestController.java:240) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.rest.RestController.tryAllHandlers(RestController.java:344) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.rest.RestController.dispatchRequest(RestController.java:174) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.AbstractHttpServerTransport.dispatchRequest(AbstractHttpServerTransport.java:320) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.AbstractHttpServerTransport.handleIncomingRequest(AbstractHttpServerTransport.java:370) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.AbstractHttpServerTransport.incomingRequest(AbstractHttpServerTransport.java:299) ~[elasticsearch-7.3.2.jar:7.3.2]
fess_elasticsearch |    at org.elasticsearch.http.netty4.Netty4HttpRequestHandler.channelRead0(Netty4HttpRequestHandler.java:66) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.http.netty4.Netty4HttpRequestHandler.channelRead0(Netty4HttpRequestHandler.java:31) ~[?:?]
fess_elasticsearch |    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[?:?]
fess_elasticsearch |    at org.elasticsearch.http.netty4.Netty4HttpPipeliningHandler.channelRead(Netty4HttpPipeliningHandler.java:58) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[?:?]
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) ~[?:?]
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[?:?]
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[?:?]
fess_elasticsearch |    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[?:?]
fess_elasticsearch |    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323) ~[?:?]
fess_elasticsearch |    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[?:?]
fess_elasticsearch |    at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:287) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[?:?]
fess_elasticsearch |    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[?:?]
fess_elasticsearch |    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[?:?]
fess_elasticsearch |    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930) ~[?:?]
fess_elasticsearch |    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[?:?]
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:682) ~[?:?]
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:582) ~[?:?]
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:536) ~[?:?]
fess_elasticsearch |    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496) ~[?:?]
fess_elasticsearch |    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906) ~[?:?]
fess_elasticsearch |    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[?:?]
fess_elasticsearch |    at java.lang.Thread.run(Thread.java:834) [?:?]
fess_elasticsearch | Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.binary.Base64
fess_elasticsearch |    at java.net.URLClassLoader.findClass(URLClassLoader.java:471) ~[?:?]
fess_elasticsearch |    at java.lang.ClassLoader.loadClass(ClassLoader.java:588) ~[?:?]
fess_elasticsearch |    at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:899) ~[?:?]
fess_elasticsearch |    at java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[?:?]
fess_elasticsearch |    ... 83 more
```

## エラー回避：java.lang.Exception: java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64

これまた入手します。

[Apache Commons Codec](https://commons.apache.org/proper/commons-codec/)　より　[commons-codec-1.13-bin.tar.gz](http://ftp.jaist.ac.jp/pub/apache//commons/codec/binaries/commons-codec-1.13-bin.tar.gz)　をダウンロードします。
解凍して出来上がった`commons-codec-1.13.jar`を`fess_plugins/configsync`へぶち込みます。


# できました！

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/603af785-477e-4f1b-759d-8bada41168a7.png)


2019.09.24追記

# 頂いたコメントについて

shinsuke_sugayaさんからご指摘頂いた通り、fessに付属のpluginsは公式のpluginsとは違いました。

https://repo1.maven.org/maven2/org/codelibs/

どうしてもローカルインストールしたいのでURL調べてDLしてきました。

- [elasticsearch-analysis-extension-7.3.0.zip](https://repo1.maven.org/maven2/org/codelibs/elasticsearch-analysis-extension/7.3.0/elasticsearch-analysis-extension-7.3.0.zip)
- [elasticsearch-analysis-fess-7.3.0.zip](https://repo1.maven.org/maven2/org/codelibs/elasticsearch-analysis-fess/7.3.0/elasticsearch-analysis-fess-7.3.0.zip)
- [elasticsearch-configsync-7.3.0.zip](https://repo1.maven.org/maven2/org/codelibs/elasticsearch-configsync/7.3.0/elasticsearch-configsync-7.3.0.zip)
- [elasticsearch-dataformat-7.3.0.zip](https://repo1.maven.org/maven2/org/codelibs/elasticsearch-dataformat/7.3.0/elasticsearch-dataformat-7.3.0.zip)
- [elasticsearch-minhash-7.3.0.zip](https://repo1.maven.org/maven2/org/codelibs/elasticsearch-minhash/7.3.0/elasticsearch-minhash-7.3.0.zip)

ローカルで解凍してみましたが悩んでいた依存問題はjarが含まれておりました。
が…インストールがうまく行きません。

```dockerfile
:
# install elasticsearch plugins
WORKDIR ${ES_HOME}

COPY ./plugins/elasticsearch-analysis-extension-7.3.0.zip /tmp/elasticsearch/plugins/
COPY ./plugins/elasticsearch-analysis-fess-7.3.0.zip /tmp/elasticsearch/plugins/
COPY ./plugins/elasticsearch-configsync-7.3.0.zip /tmp/elasticsearch/plugins/
COPY ./plugins/elasticsearch-dataformat-7.3.0.zip /tmp/elasticsearch/plugins/
COPY ./plugins/elasticsearch-minhash-7.3.0.zip /tmp/elasticsearch/plugins/

RUN ./bin/elasticsearch-plugin install file:///tmp/elasticsearch/elasticsearch-analysis-extension-7.3.0.zip
RUN ./bin/elasticsearch-plugin install file:///tmp/elasticsearch/plugins/elasticsearch-analysis-fess-7.3.0.zip
RUN ./bin/elasticsearch-plugin install file:///tmp/elasticsearch/plugins/elasticsearch-configsync-7.3.0.zip
RUN ./bin/elasticsearch-plugin install file:///tmp/elasticsearch/plugins/elasticsearch-dataformat-7.3.0.zip
RUN ./bin/elasticsearch-plugin install file:///tmp/elasticsearch/plugins/elasticsearch-minhash-7.3.0.zip
:
```


```console
Step 18/29 : RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///tmp/elasticsearch/plugins/elasticsearch-analysis-extension-7.3.0.zip
 ---> Running in 63e4cc74e7e2
-> Downloading file:///tmp/elasticsearch/plugins/elasticsearch-analysis-extension-7.3.0.zip
[=================================================] 100%??
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.lang.RuntimePermission accessDeclaredMembers
* java.lang.RuntimePermission getClassLoader
* java.lang.reflect.ReflectPermission suppressAccessChecks
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.

Exception in thread "main" java.lang.IllegalStateException: unable to read from standard input; is standard input open and a tty attached?
        at org.elasticsearch.cli.Terminal$SystemTerminal.readText(Terminal.java:173)
        at org.elasticsearch.plugins.PluginSecurity.prompt(PluginSecurity.java:74)
        at org.elasticsearch.plugins.PluginSecurity.confirmPolicyExceptions(PluginSecurity.java:67)
        at org.elasticsearch.plugins.InstallPluginCommand.installPlugin(InstallPluginCommand.java:811)
        at org.elasticsearch.plugins.InstallPluginCommand.install(InstallPluginCommand.java:785)
        at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:231)
        at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:216)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
        at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:77)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
        at org.elasticsearch.cli.Command.main(Command.java:90)
        at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)
ERROR: Service 'elasticsearch' failed to build: The command '/bin/sh -c /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///tmp/elasticsearch/plugins/elasticsearch-analysis-extension-7.3.0.zip' returned a non-zero code: 1

```

でもfess_pluginsの時みたいにダイレクトにCopyするとなんだか起動しているっぽいです。
ちなみにフォルダ名は解凍して出来上がった`plugin-descriptor.properties`の`name`を使っています。
解凍ついでに`elasticsearch.version=`を`7.3.2`に、`java.version=1.8`を`1.11`に変更しちゃってます。


```dockerfile
:
# install elasticsearch plugins
WORKDIR ${ES_HOME}

COPY ./plugins/analysis-extension ./plugins/analysis-extension
COPY ./plugins/analysis-fess ./plugins/analysis-fess
COPY ./plugins/configsync ./plugins/configsync
COPY ./plugins/dataformat ./plugins/dataformat
COPY ./plugins/minhash ./plugins/minhash
:
```

```console
:
fess_elasticsearch | [2019-09-25T06:13:42,405][INFO ][o.e.p.PluginsService     ] [14ead7802c88] loaded plugin [analysis-extension]
fess_elasticsearch | [2019-09-25T06:13:42,410][INFO ][o.e.p.PluginsService     ] [14ead7802c88] loaded plugin [analysis-fess]
fess_elasticsearch | [2019-09-25T06:13:42,411][INFO ][o.e.p.PluginsService     ] [14ead7802c88] loaded plugin [configsync]
fess_elasticsearch | [2019-09-25T06:13:42,412][INFO ][o.e.p.PluginsService     ] [14ead7802c88] loaded plugin [dataformat]
fess_elasticsearch | [2019-09-25T06:13:42,414][INFO ][o.e.p.PluginsService     ] [14ead7802c88] loaded plugin [minhash]:
```

今宵はタイムアップでございますm(_ _)m