Fessをdocker runだけでデータを永続化して起動してエラーするなら「-v $PWD/data/es/config:/etc/elasticsearch」は抜いた方が良いかもしれない。
やりたいこと
そしていつでも落とせるようにデータは永続化したい。
ただ公式通りだとエラーする。それの対処法。
-v $PWD/data/es/config:/etc/elasticsearchを抜いた方が良いかもしれない話
追記: 2020/1/30 : 公式のREADMEがアップデートされて上記のマウントは消えた:
hr.icon
現在の公式のdocker-fessでは以下のように-v $PWD/data/es/config:/etc/elasticsearchをしている。
code:console
$ mkdir -p ./data/fess/config data/es/{config,data}
$ sudo chown -R 1001:1001 ./data/fess
$ sudo chown -R 1000:1000 ./data/es
$ docker run -d -p 8080:8080 --name fess \
-v $PWD/data/fess/config:/opt/fess \
-v $PWD/data/es/config:/etc/elasticsearch \
-v $PWD/data/es/data:/var/lib/elasticsearch codelibs/fess:latest
ただ、上記のコマンド通り実行すると、以下のようにエラーする。
https://gyazo.com/23a9e787bac500194ed2ca5cf61fa5b2
code:検索用エラーメッセージ
at org.codelibs.curl.CurlRequest.lambda$connect$3(CurlRequest.java:201) ~curl4j-1.2.4.jar:? at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(Unknown Source) ~?:? at java.util.concurrent.ForkJoinTask.doExec(Unknown Source) ~?:? at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source) ~?:? at java.util.concurrent.ForkJoinPool.scan(Unknown Source) ~?:? at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source) ~?:? at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source) ~?:? Caused by: org.codelibs.curl.CurlException: Failed to access the response.
at org.codelibs.curl.CurlRequest$RequestProcessor.accept(CurlRequest.java:272) ~curl4j-1.2.4.jar:? at org.codelibs.curl.CurlRequest.lambda$execute$4(CurlRequest.java:218) ~curl4j-1.2.4.jar:? at org.codelibs.curl.CurlRequest.lambda$connect$3(CurlRequest.java:199) ~curl4j-1.2.4.jar:? at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(Unknown Source) ~?:? at java.util.concurrent.ForkJoinTask.doExec(Unknown Source) ~?:? at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source) ~?:? at java.util.concurrent.ForkJoinPool.scan(Unknown Source) ~?:? at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source) ~?:? at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source) ~?:? Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method) ~?:? at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~?:? at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~?:? at java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~?:? at java.net.Socket.connect(Unknown Source) ~?:? at java.net.Socket.connect(Unknown Source) ~?:? at sun.net.NetworkClient.doConnect(Unknown Source) ~?:? at sun.net.www.http.HttpClient.openServer(Unknown Source) ~?:? at sun.net.www.http.HttpClient.openServer(Unknown Source) ~?:? at sun.net.www.http.HttpClient.<init>(Unknown Source) ~?:? at sun.net.www.http.HttpClient.New(Unknown Source) ~?:? at sun.net.www.http.HttpClient.New(Unknown Source) ~?:? at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) ~?:? at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source) ~?:? at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) ~?:? at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) ~?:? at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source) ~?:? at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) ~?:? at java.net.HttpURLConnection.getResponseCode(Unknown Source) ~?:? at org.codelibs.curl.CurlRequest$RequestProcessor.accept(CurlRequest.java:269) ~curl4j-1.2.4.jar:? at org.codelibs.curl.CurlRequest.lambda$execute$4(CurlRequest.java:218) ~curl4j-1.2.4.jar:? at org.codelibs.curl.CurlRequest.lambda$connect$3(CurlRequest.java:199) ~curl4j-1.2.4.jar:? at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(Unknown Source) ~?:? at java.util.concurrent.ForkJoinTask.doExec(Unknown Source) ~?:? at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source) ~?:? at java.util.concurrent.ForkJoinPool.scan(Unknown Source) ~?:? at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source) ~?:? at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source) ~?:? Elasticsearch is not available.
そこで原因を探した。
それで最終的に-v $PWD/data/es/config:/etc/elasticsearchなしで実行することで動くことを確認した。
現在のところ動くdocker run
code:bash
mkdir -p ./data/fess/config data/es/{config,data}
sudo chown -R 1001:1001 ./data/fess
sudo chown -R 1000:1000 ./data/es
docker run -p 8080:8080 \
-v $PWD/data/fess/config:/opt/fess \
-v $PWD/data/es/data:/var/lib/elasticsearch \
codelibs/fess:latest
おまけ: 上記のエラーの原因を探すまで
現在の最新である13.5のDockerfileを見ると、ENTRYPOINT /usr/share/fess/run.shになっていることがわかる。このENTRYPOINTでごにょごにょコンテナ内のファイルたちを書き換える可能性があるため、docker run -it --entrypoint=/bin/bash codelibs/fess:latestで起動してイメージの初期状態のファイルがどうなっているの調べた。 それで永続化対象になっている以下のディレクトリを順々に見ていった。
/opt/fess
/etc/elasticsearch
/var/lib/elasticsearch
その結果/etc/elasticsearchにはすでにファイルがあることがわかった。具体的には以下のファイルがある。
code:console
root@b999c0a92f8c:/etc/elasticsearch# ls
elasticsearch.keystore elasticsearch.yml jvm.options log4j2.properties
そして上記のjvm.optionsファイルに関してはdocker-fess公式のREADMEに書いてある方法で動かした時に以下のjava.nio.file.NoSuchFileException: /etc/elasticsearch/jvm.optionsエラーメッセージが出ることから原因かもなと思っていた箇所でもあった。
code:エラー
Exception in thread "main" java.nio.file.NoSuchFileException: /etc/elasticsearch/jvm.options
at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(Unknown Source)
at java.base/java.nio.file.Files.newByteChannel(Unknown Source)
at java.base/java.nio.file.Files.newByteChannel(Unknown Source)
at java.base/java.nio.file.spi.FileSystemProvider.newInputStream(Unknown Source)
at java.base/java.nio.file.Files.newInputStream(Unknown Source)
at org.elasticsearch.tools.launchers.JvmOptionsParser.main(JvmOptionsParser.java:62)
-v $PWD/data/es/config:/etc/elasticsearchを抜かずに上記のファイルをあらかじめ$PWD/data/es/configに用意すれば動くかもしれないがElasticsearchの設定まで保存する必要性がもしないとすればなくても良いかもと思ってとりあえず消してみてうまく動いている。 -v $PWD/data/es/config:/etc/elasticsearchを抜いても永続化できるているかは要調査。
追記2020/1/30: 公式READMEから削除されたので大丈夫。
/etc/elasticsearchに保存されるファイルにどんなものがあるか調べて、そのファイルなしでもFessの設定やクロールしたデータが永続化できそうならよしとしたい。