Metabase 在 Docker 上的故障排除
Docker 简化了运行 Metabase 的许多方面,但也有一些需要注意的陷阱。如果您在使用 Docker 运行 Metabase 时遇到问题,请尝试按照以下故障排除流程进行操作,然后查找有关您遇到的具体问题的详细信息。
- 容器是否正在运行?
- 服务器是否在容器内运行?
- Metabase 是否使用正确的应用程序数据库?
- 您能否通过 Metabase 端口连接到 Docker 主机?
- 您能否从 Docker 主机连接到容器?
- 您可能会发现这些命令在操作过程中很有用。要进入 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 容器的日志在“正在验证数据库连接”行后返回错误消息。
如何解决: 尝试使用 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 或“权限拒绝”消息,或包含 org.sqlite.core.NativeDB._open_utf8
的 SQLite 错误。
如何解决: 确保运行 Metabase 的用户具有对文件或目录的读写权限:
- 如果您在本地机器或服务器上以 JAR 文件运行 Metabase,请检查运行 Java 进程的用户。
- 如果您是从 Docker 容器运行 Metabase,请确保您正在使用
/metabase.db
目录。
如果您在任何类 Unix 操作系统中从 JAR 运行 Metabase,您可以通过打开终端并键入 ps -uA | grep metabase
来查看哪个用户正在运行 Metabase。
阅读其他版本的 Metabase 的文档。