Solr Docker 常見問題
我該如何持久化 Solr 資料和設定?
Solr 的 Docker 映像檔已預先設定容器路徑 /var/solr/
作為磁碟區。這表示即使您移除容器執行個體,所有索引資料、日誌檔案和其他變數資料都會持久保存在 Docker 主機上。
我該如何將主機目錄掛載為資料磁碟區?
預設情況下,Solr 的磁碟區會持久保存在主機上 Docker 的預設儲存位置。在 Linux 系統上,這是 /var/lib/docker/volumes
。這是儲存 Solr 資料的建議方式。您也可以彈性地使用繫結掛載的主機資料夾
docker run --rm -p 8983:8983 -v $(pwd)/myData:/var/solr/ solr:9-slim
但這既取決於主機作業系統,也可能遇到不同種類的檔案系統權限問題。
我可以在 SOLR_HOME 中使用磁碟區嗎?
雖然您可以在容器內重新定義 SOLR_HOME
,但我們建議您改為使用在 /var/solr/
定義的現有 SOLR_HOME
,請參閱上文。您可以為磁碟區提供有意義的名稱,而不是自動產生的雜湊,例如名稱 solrData
docker run --rm -p 8983:8983 -v solrData:/mysolrhome solr:9-slim
我可以在 Docker 下執行 ZooKeeper 和 Solr 叢集嗎?
可以。您可以簡單地以「雲端模式」啟動您的 Solr 容器,將它們指向 Zookeeper 集群。
對於本機開發,使用單一 zookeeper 容器就已足夠。請參閱 Zookeeper docker 映像檔以取得詳細資訊。
對於生產用途,我們不建議您自行部署 Zookeeper 編排,因為其中存在許多陷阱。請改用支援 Solr 和 Zookeeper 的完善容器編排器。對於 Kubernetes,我們提供 Solr Operator 子專案。此外,還有第三方 Helm 圖表可供使用。
我該如何消除 Solr 啟動時的「共享記憶體」警告?
啟動 docker 映像檔時,您通常會看到這些日誌行
OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory. (error = 1)
如果您的設定可以在沒有巨型頁面的情況下執行,或者您不需要它,則消除此警告的最低摩擦方式是透過環境變數停用 JVM 中的大型分頁
SOLR_OPTS=-XX:-UseLargePages
在您的 Solr 管理 UI 中,您會在 JVM 引數下列出 GC_TUNE
環境變數設定的原始 -XX:+UseLargePages
,以及在清單下方覆寫的 -XX:-UseLargePages
引數。
我對 Solr 的不同調用方式感到困惑 — 請協助?
Solr Docker 映像的不同調用方式可能會讓人感到困惑,因為映像的名稱是 "solr",而 Solr 命令也是 "solr",並且映像會以特殊的方式解讀各種參數。讓我們來說明各種調用方式。
在映像中執行任意命令
docker run -it solr date
這裡 "solr" 是映像的名稱,而 "date" 是命令。這不會調用任何 Solr 功能。
執行 Solr 伺服器
docker run -it solr
這裡 "solr" 是映像的名稱,且沒有指定命令,因此映像預設會執行 "solr" 命令並帶有 "-f" 參數,以前景模式執行。
執行帶有額外參數的 Solr 伺服器
docker run -it solr -h myhostname
這與前一個相同,但傳遞了一個額外參數。映像會執行 "solr" 命令並帶有 "-f -h myhostname" 參數。
將 solr 作為任意命令執行
docker run -it solr solr zk --help
這裡第一個 "solr" 是映像名稱,而第二個 "solr" 是 "solr" 命令。映像會完全按照指定的執行命令;不會隱式添加 "-f"。容器會列印說明文字,然後退出。
如果您覺得這樣在視覺上令人困惑,使用更具體的映像標籤和特定的命令路徑可能會有所幫助。例如
docker run -it solr bin/solr start -f -h myhostname
最後,Solr Docker 映像提供了幾個在調用 Solr 伺服器之前會執行一些工作的命令,例如 "solr-precreate" 和 "solr-demo"。請參閱 README.md 以了解用法。這些是通過 docker-entrypoint.sh
腳本實現的,並且必須作為映像的第一個參數傳遞。例如
docker run -it solr solr-demo
這裡理解一個實作細節很重要。Dockerfile 使用 solr-foreground
作為 CMD
,而 docker-entrypoint.sh
通過執行 "solr -f" 來實現。所以這兩個是等效的
docker run -it solr
docker run -it solr solr-foreground
然而
docker run -it solr solr -f
略有不同:這裡的 "solr" 是一個通用命令,不會被 docker-entrypoint.sh
以任何特殊方式處理。 特別是,這表示 docker-entrypoint-initdb.d
機制不會被應用。因此,如果您想使用 docker-entrypoint-initdb.d
,則必須使用其他兩種調用方式之一。當您想從 bash 命令調用 solr 時,也需要記住這一點。例如,這不會執行 docker-entrypoint-initdb.d
腳本
docker run -it -v $PWD/set-heap.sh:/docker-entrypoint-initdb.d/set-heap.sh \
solr bash -c "echo hello; solr -f"
但這個會執行
docker run -it $PWD/set-heap.sh:/docker-entrypoint-initdb.d/set-heap.sh \
solr bash -c "echo hello; /opt/docker-solr/scripts/docker-entrypoint.sh solr-foreground"