在 Docker 上疑難排解 Metabase
Docker 簡化了執行 Metabase 的許多方面,但有一些陷阱需要注意。如果您在使用 Docker 執行 Metabase 時遇到問題,請嘗試依照下方的疑難排解程序進行,然後查看下方以了解您發現的特定問題的詳細資訊。
- 容器是否正在執行?
- 伺服器是否在容器內執行?
- Metabase 是否使用正確的應用程式資料庫?
- 您可以連線到 Metabase 連接埠上的 Docker 主機嗎?
- 您可以從 Docker 主機連線到容器嗎?
- 您可以從容器內連線到伺服器嗎?
您可能會發現這些命令在過程中很有用。若要進入 Metabase 容器中的 shell
docker exec -ti CONTAINER_NAME bash
以及取得 Metabase 容器的記錄
docker logs -f CONTAINER_NAME
Metabase 容器在未啟動伺服器的情況下結束
如何偵測到此情況: 執行 docker ps
以查看 Metabase 容器目前是否正在執行。如果是,請繼續下一個步驟。
如果 docker ps
未顯示正在執行的容器,則執行下列命令以列出已停止的容器
docker ps -a | grep metabase/metabase
尋找最近結束的容器,並記下容器 ID。使用下列命令查看該容器的記錄
Docker logs CONTAINER_ID
Metabase 容器正在執行,但伺服器未執行
如何偵測到此情況: 執行 docker ps
以確保容器正在執行。伺服器應將記錄寫入 Docker 容器記錄中。執行下列命令以檢查此情況
docker logs CONTAINER_NAME
您應該會在開頭看到如下所示的行
05-10 18:11:32 INFO metabase.util :: Loading Metabase...
再往下,您最終應該會看到如下所示的行
05-10 18:12:30 INFO metabase.core :: Metabase Initialization COMPLETE
如果您看到以下幾行
05-15 19:07:11 INFO metabase.core :: Metabase Shutting Down ...
05-15 19:07:11 INFO metabase.core :: Metabase Shutdown COMPLETE
則 Metabase 已自行關閉。
如何修正此問題: 檢查 Docker 容器記錄中是否有關於連線到應用程式資料庫的錯誤。監看記錄以查看 Metabase 是否仍在啟動;命令
Docker logs -f CONTAINER_ID
可讓您查看列印的記錄。
如果容器在完成啟動之前終止,則問題可能是用於啟動容器的協調服務 (例如 Docker Cloud) 中的健康檢查逾時。
如果容器未從外部終止,但仍然無法啟動,則此問題可能與 Docker 無關。如果您使用的是 Metabase 提供的映像,請開啟 GitHub 問題。
未連線到遠端應用程式資料庫
如何偵測到此情況: 如果這是新的 Metabase 執行個體,則您透過環境變數指定的資料庫將會是空的。如果這是具有不正確環境參數的現有 Metabase 執行個體,伺服器將會建立新的 H2 內嵌資料庫以用於應用程式資料,您會在記錄中看到類似以下的行
05-10 18:11:40 INFO metabase.core :: Setting up and migrating Metabase DB. Please sit tight, this may take a minute...
05-10 18:11:40 INFO metabase.db :: Verifying h2 Database Connection ...
05-10 18:11:40 INFO metabase.db :: Verify Database Connection ... ✅
如何修正此問題: 檢查您是否正確地將環境傳遞至 Docker。您可以使用下列命令列出容器的環境變數
docker inspect some-postgres -f '{{ .Config.Env }}'
Metabase 伺服器無法連線到 MySQL 或 PostgreSQL 資料庫
如何偵測到此情況: Docker 容器的記錄會在「正在驗證資料庫連線」行之後傳回錯誤訊息。
如何修正此問題: 嘗試使用 mysql
或 psql
命令,搭配您在透過環境變數傳遞的連線字串參數進行連線。如果您無法連線到資料庫,則問題是由於認證或連線能力。若要驗證認證是否正確,請從另一部機器使用這些認證登入,然後嘗試從執行 Docker 容器的主機建立相同的連線。
執行此作業的一種簡單方式是使用 Docker 啟動具有適用於您資料庫之用戶端的容器。對於 Postgres,這看起來會像這樣
docker run --name postgres-client --rm -ti --entrypoint /bin/bash postgres
從該容器內,嘗試使用容器中的用戶端命令 (例如 psql
) 連線到資料庫主機。如果您能夠從相同主機上的另一個容器連線,則嘗試從 Metabase Docker 容器本身內建立該連線
docker exec -ti container-name bash
您也可以嘗試使用 nc
命令連線到資料庫主機,並檢查是否可以開啟連線
nc -v your-db-host 5432
這些步驟將協助您判斷問題是出在網路還是驗證。
Metabase 應用程式資料庫未持續保存
如何偵測到此情況: 如果您每次啟動應用程式時都收到「設定」畫面,就會發生這種情況。最常見的原因是未提供 Docker 容器持續性檔案系統掛載點以放置應用程式資料庫。
如何修正此問題: 確定您提供容器一個持續性磁碟區。
內部連接埠未正確重新對應
如何偵測到此情況: 執行 docker ps
並查看連接埠對應,然後執行 curl https://127.0.0.1:port-number-here/api/health
。這應傳回類似以下的 JSON 回應
{"status":"ok"}
如何修正此問題: 確定在您用來啟動 Metabase 容器映像的 docker run
命令中包含 -p 3000:3000
或類似的連接埠重新對應。
Metabase 無法寫入或讀取檔案或目錄
如何偵測到此情況: 記錄中的訊息會清楚指出來自 Java 的 IOError 或「Permission denied」(權限遭拒),或來自 SQLite 的錯誤,其中包含 org.sqlite.core.NativeDB._open_utf8
。
如何修正此問題: 確保執行 Metabase 的使用者具有讀取和寫入檔案或目錄的權限
- 如果您在本機或伺服器中以 JAR 檔案形式執行 Metabase,請檢查執行 Java 程序的 使用者。
- 如果您是從 Docker 容器執行 Metabase,請確定您使用的是
/metabase.db
目錄。
如果您是從任何類 Unix 作業系統中的 JAR 執行 Metabase,您可以開啟終端機並輸入 ps -uA | grep metabase
,以查看哪個使用者正在執行 Metabase。
閱讀其他Metabase 版本的文件。