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 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 容器的日志在“Verifying Database Connection”行之后返回错误消息。

如何解决: 尝试使用 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 或“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 的文档。

这有帮助吗?

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