Metabase 在 Docker 上的故障排除

Docker 简化了运行 Metabase 的许多方面,但也有一些需要注意的陷阱。如果您在使用 Docker 运行 Metabase 时遇到问题,请尝试按照以下故障排除流程进行操作,然后查找有关您遇到的具体问题的详细信息。

  1. 容器是否正在运行?
  2. 服务器是否在容器内运行?
  3. Metabase 是否使用正确的应用程序数据库?
  4. 您能否通过 Metabase 端口连接到 Docker 主机?
  5. 您能否从 Docker 主机连接到容器?
  6. 您可能会发现这些命令在操作过程中很有用。要进入 Metabase 容器中的 shell:

进入 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 issue

未连接到远程应用程序数据库

如何检测: 如果这是一个新的 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://:port-number-here/api/health。这应该返回一个 JSON 响应,看起来像:

{"status":"ok"}

如何解决: 确保在用于启动 Metabase 容器镜像的 docker run 命令中包含 -p 3000:3000 或类似的端口重新映射。

Metabase 无法写入或读取文件或目录

如何检测: 日志中会清楚地显示 Java 的 IOError 或“权限拒绝”消息,或包含 org.sqlite.core.NativeDB._open_utf8 的 SQLite 错误。

如何解决: 确保运行 Metabase 的用户具有对文件或目录的读写权限:

  • 如果您在本地机器或服务器上以 JAR 文件运行 Metabase,请检查运行 Java 进程的用户。
  • 如果您是从 Docker 容器运行 Metabase,请确保您正在使用 /metabase.db 目录。

如果您在任何类 Unix 操作系统中从 JAR 运行 Metabase,您可以通过打开终端并键入 ps -uA | grep metabase 来查看哪个用户正在运行 Metabase。

阅读其他版本的 Metabase 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档吗?提出修改建议。
© . This site is unofficial and not affiliated with Metabase, Inc.