在 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 上提交问题。
未连接到远程应用数据库
如何检测: 如果这是一个新的 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 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 版本的文档。