在 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 http://localhost: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 版本的文档。

© . All rights reserved.