在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 https://127.0.0.1:port-number-here/api/health。这应该返回一个看起来像的JSON响应

{"status":"ok"}

如何解决这个问题: 确保在您使用 docker run 命令启动Metabase容器镜像时包含 -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版本 的文档。

想要改进这些文档? 提出更改。