在 Docker 上疑難排解 Metabase

Docker 簡化了執行 Metabase 的許多方面,但有一些陷阱需要注意。如果您在使用 Docker 執行 Metabase 時遇到問題,請嘗試依照下方的疑難排解程序進行,然後查看下方以了解您發現的特定問題的詳細資訊。

  1. 容器是否正在執行?
  2. 伺服器是否在容器內執行?
  3. Metabase 是否使用正確的應用程式資料庫?
  4. 您可以連線到 Metabase 連接埠上的 Docker 主機嗎?
  5. 您可以從 Docker 主機連線到容器嗎?
  6. 您可以從容器內連線到伺服器嗎?

您可能會發現這些命令在過程中很有用。若要進入 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 容器的記錄會在「正在驗證資料庫連線」行之後傳回錯誤訊息。

如何修正此問題: 嘗試使用 mysqlpsql 命令,搭配您在透過環境變數傳遞的連線字串參數進行連線。如果您無法連線到資料庫,則問題是由於認證或連線能力。若要驗證認證是否正確,請從另一部機器使用這些認證登入,然後嘗試從執行 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 版本的文件。