在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 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版本 的文档。