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 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”行之后返回错误消息。
如何解决: 尝试使用 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://: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 的文档。