在 Docker 上运行 Metabase

为了获得快速、可靠和安全的部署,避免自托管带来的工作或隐藏成本,请查看 Metabase 云

Metabase 通过 Dockerhub 提供官方 Docker 镜像,可用于在任何运行 Docker 的系统上进行部署。

如果你想在 Docker 上升级你的 Metabase 版本,请查看这些 升级说明

开源版本快速入门

使用此快速入门在本地运行 Metabase 开源版本。有关在生产环境中运行 Metabase 的说明,请参见下文 在生产环境中运行 Metabase

假设你已安装并运行 Docker,请获取最新的 Docker 镜像

docker pull metabase/metabase:latest

然后启动 Metabase 容器

docker run -d -p 3000:3000 --name metabase metabase/metabase

默认情况下,这将启动一个在端口 3000 上运行的 Metabase 服务器。

可选:要查看开源 Metabase 初始化时的日志,请运行

docker logs -f metabase

启动完成后,你可以通过以下地址访问你的开源 Metabase:https://127.0.0.1:3000

要在不同的端口(例如端口 12345)上运行你的开源 Metabase

docker run -d -p 12345:3000 --name metabase metabase/metabase

Pro 或 企业版快速入门

如果你拥有 许可证令牌,用于 Metabase Pro 或企业版,并且想在本地运行 Metabase,请使用此快速入门。有关在生产环境中运行 Metabase 的说明,请参见下文 在生产环境中运行 Metabase

假设你已安装并运行 Docker,请获取最新的 Docker 镜像

docker pull metabase/metabase-enterprise:latest

然后启动 Metabase 容器

docker run -d -p 3000:3000 --name metabase metabase/metabase-enterprise

默认情况下,这将启动一个在端口 3000 上运行的 Metabase 服务器。

可选:要查看 Metabase 初始化时的日志,请运行

docker logs -f metabase

启动完成后,你可以通过以下地址访问你的 Pro 或 企业版 Metabase:https://127.0.0.1:3000

要在不同的端口(例如端口 12345)上运行你的 Pro 或 企业版 Metabase

docker run -d -p 12345:3000 --name metabase metabase/metabase-enterprise

生产环境安装

Metabase 自带一个嵌入式 H2 数据库,它使用文件系统来存储自身的应用程序数据。这意味着,如果你删除容器,你将丢失你的 Metabase 应用程序数据(你的问题、仪表板、集合等等)。

如果你想在生产环境中运行 Metabase,你需要将你的应用程序数据存储在一个 生产就绪的数据库 中。

一旦你为 Metabase 准备好了一个数据库(如 Postgres)来存储其应用程序数据,你所需要做的就是向 Metabase 提供连接信息和凭据,以便 Metabase 可以连接到它。

在生产环境中运行 Docker

假设你通过运行以下命令设置了一个 Postgres 数据库

createdb metabaseappdb

无需添加任何表;Metabase 将在启动时创建这些表。并且假设可以通过 my-database-host:5432 主机名 name 用户名和 password 密码访问该数据库。

这是一个告诉 Metabase 使用该数据库的 Docker 命令示例

docker run -d -p 3000:3000 \
  -e "MB_DB_TYPE=postgres" \
  -e "MB_DB_DBNAME=metabaseappdb" \
  -e "MB_DB_PORT=5432" \
  -e "MB_DB_USER=name" \
  -e "MB_DB_PASS=password" \
  -e "MB_DB_HOST=my-database-host" \
   --name metabase metabase/metabase

请记住,Metabase 将从你的 Docker 容器内部连接,因此请确保:a) 你正在使用完全限定的主机名,或者 b) 你已在容器的 /etc/hosts file 文件中设置了正确的条目。

迁移到生产环境安装

如果你已经使用默认的应用程序数据库 (H2) 运行 Metabase,并且想使用生产就绪的应用程序数据库而不丢失你的应用程序数据(你的问题、仪表板等),请参阅 从 H2 迁移到生产数据库

Docker compose YAML 文件示例

这是一个用于运行 Metabase 并使用 PostgreSQL 数据库 metabaseappdbdocker-compose.yml 文件示例

version: "3.9"
services:
  metabase:
    image: metabase/metabase:latest
    container_name: metabase
    hostname: metabase
    volumes:
      - /dev/urandom:/dev/random:ro
    ports:
      - 3000:3000
    environment:
      MB_DB_TYPE: postgres
      MB_DB_DBNAME: metabaseappdb
      MB_DB_PORT: 5432
      MB_DB_USER: metabase
      MB_DB_PASS: mysecretpassword
      MB_DB_HOST: postgres
    networks:
      - metanet1
    healthcheck:
      test: curl --fail -I https://127.0.0.1:3000/api/health || exit 1
      interval: 15s
      timeout: 5s
      retries: 5
  postgres:
    image: postgres:latest
    container_name: postgres
    hostname: postgres
    environment:
      POSTGRES_USER: metabase
      POSTGRES_DB: metabaseappdb
      POSTGRES_PASSWORD: mysecretpassword
    networks:
      - metanet1
networks:
  metanet1:
    driver: bridge

额外的 Docker 维护和配置

自定义 Metabase Jetty 服务器

你可以通过在 Docker 运行命令中设置环境变量来使用来自 自定义 Metabase Jetty Web 服务器 的任何自定义设置。

Docker 特定的环境变量

除了标准的自定义设置外,还有两个 Docker 特定的环境变量 MUIDMGID ,它们用于设置 Metabase 在 Docker 容器中运行时使用的用户和组 ID。这些设置使得在主机和容器之间共享文件(例如应用程序数据库)时,可以匹配文件权限。

以下是如何使用由你的账户拥有并存储在你的主目录中的数据库文件的方法

docker run -d -v ~/my-metabase-db:/metabase.db --name metabase -e MB_DB_FILE=/metabase.db -e MUID=$UID -e MGID=$GID -p 3000:3000 metabase/metabase

设置 Java 时区

最好将你的 Java 时区设置为与你希望所有报告显示的的时区一致。你可以通过简单地指定 JAVA_TIMEZONE 环境变量来实现这一点,Metabase 启动脚本会拾取这个变量。例如

docker run -d -p 3000:3000 \
  -e "JAVA_TIMEZONE=US/Pacific" \
  --name metabase metabase/metabase

复制应用程序数据库

容器中应用程序数据库的默认位置是 /metabase.db/metabase.db.mv.db 。你可以使用以下命令将此目录从容器中复制出来(将 CONTAINER_ID 替换为实际的容器 ID 或名称,如果你命名了容器,则为 metabase

docker cp CONTAINER_ID:/metabase.db ./

数据库内容将保留在名为 metabase.db 的目录中。

挂载映射的文件存储卷

为了在容器外部持久化你的数据,并使其在容器启动之间可用,我们可以在容器内挂载一个本地文件路径。

docker run -d -p 3000:3000 \
  -v ~/metabase-data:/metabase-data \
  -e "MB_DB_FILE=/metabase-data/metabase.db" \
  --name metabase metabase/metabase

当你启动容器时,Metabase 将使用位于 ~/metabase-data/metabase.db 的数据库文件(MB_DB_FILE),而不是其默认位置。并且我们将该文件夹从本地文件系统挂载到容器中。

如果你停止了容器,如何恢复你的配置

如果你之前使用本地数据库运行并配置了 Metabase,然后停止了容器,那么你的数据仍然会存在,除非你使用 docker rm 命令删除了容器。要恢复你之前的配置

1. 使用 docker ps -a 命令查找已停止的容器。它看起来会像这样

docker ps -a | grep metabase
    ca072cd44a49        metabase/metabase        "/app/run_metabase.sh"   About an hour ago   Up About an hour          0.0.0.0:3000->3000/tcp   metabase
    02e4dff057d2        262aa3d0f714             "/app/run_metabase.sh"   23 hours ago        Exited (0) 23 hours ago                            pedantic_hypatia
    0d2170d4aa4a        262aa3d0f714             "/app/run_metabase.sh"   23 hours ago        Exited (0) 23 hours ago                            stoic_lumiere

一旦你确定了包含你的配置的已停止容器,请从最左列中保存容器 ID 以进行下一步。

2. 使用 docker commit 从包含你的配置的已停止容器创建一个新的自定义 Docker 镜像。

docker commit ca072cd44a49 mycompany/metabase-custom
sha256:9ff56186de4dd0b9bb2a37c977c3a4c9358647cde60a16f11f4c05bded1fe77a

3. 使用 docker run 运行你的新镜像,以再次启动并运行。

docker run -d -p 3000:3000 --name metabase mycompany/metabase-custom
430bb02a37bb2471176e54ca323d0940c4e0ee210c3ab04262cb6576fe4ded6d

您应该能恢复您之前配置的 Metabase 安装。如果这不是您预期的那个,请尝试另一个已停止的容器并重复这些步骤。

添加外部依赖项或插件

要添加外部依赖 JAR 文件(例如 Oracle 或 Vertica JDBC 驱动程序或第三方 Metabase 驱动程序),您需要

  • 在您的主机系统中创建一个 plugins 目录,并且
  • 绑定该目录,使其作为路径 /plugins 对 Metabase 可用(使用 --mount-v/--volume)。

例如,如果您的主机系统上有一个名为 /path/to/plugins 的目录,您可以使用 --mount 选项使其内容对 Metabase 可用,如下所示

docker run -d -p 3000:3000 \
  --mount type=bind,source=/path/to/plugins,destination=/plugins \
  --name metabase metabase/metabase

请注意,Metabase 将使用此目录来提取默认 Metabase 发行版捆绑的插件(例如各种数据库(如 SQLite)的驱动程序),因此 Docker 必须具有对其的读取和写入权限。

使用 Docker Secrets 隐藏敏感参数

为了使您的连接参数不被明文显示,您可以使用 Docker Secrets 将所有参数放入文件中,以便 Docker 可以在启动容器之前读取它们并将它们加载到内存中。

这是一个示例 docker-compose.yml 文件,用于启动带有 secrets 的 Metabase Docker 容器以连接到 PostgreSQL 数据库。

除了这个示例 yml 文件之外,您还需要创建两个文件

  • db_user.txt
  • db_password.txt

这些文件应与 docker-compose.yml 位于同一目录下。将 db_user 放入 db_user.txt 文件,并将 db_password 放入 db_password.txt 文件。

请注意具有 secret 的环境变量上的 “_FILE”

version: "3.9"
services:
  metabase:
    image: metabase/metabase:latest
    container_name: metabase
    hostname: metabase
    volumes:
      - /dev/urandom:/dev/random:ro
    ports:
      - 3000:3000
    environment:
      MB_DB_TYPE: postgres
      MB_DB_DBNAME: metabase
      MB_DB_PORT: 5432
      MB_DB_USER_FILE: /run/secrets/db_user
      MB_DB_PASS_FILE: /run/secrets/db_password
      MB_DB_HOST: postgres
    networks:
      - metanet1
    secrets:
      - db_password
      - db_user
    healthcheck:
      test: curl --fail -I https://127.0.0.1:3000/api/health || exit 1
      interval: 15s
      timeout: 5s
      retries: 5
  postgres:
    image: postgres:latest
    container_name: postgres
    hostname: postgres
    environment:
      POSTGRES_USER_FILE: /run/secrets/db_user
      POSTGRES_DB: metabase
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    networks:
      - metanet1
    secrets:
      - db_password
      - db_user
networks:
  metanet1:
    driver: bridge
secrets:
  db_password:
    file: db_password.txt
  db_user:
    file: db_user.txt

我们目前支持以下 环境变量 用作 secrets

  • MB_DB_USER
  • MB_DB_PASS
  • MB_DB_CONNECTION_URI
  • MB_EMAIL_SMTP_PASSWORD
  • MB_EMAIL_SMTP_USERNAME
  • MB_LDAP_PASSWORD
  • MB_LDAP_BIND_DN

为了使 Metabase 容器能够读取文件并将内容用作 secret,环境变量名称需要附加 “_FILE”,如上所述。

故障排除

请参阅故障排除指南中的“运行 Metabase”。

继续设置

现在您已经安装了 Metabase,是时候设置它并将其连接到您的数据库了。

阅读其他Metabase 版本的文档。