在 Docker 上运行 Metabase

要获得快速、可靠且安全的部署,而无需自托管带来的工作或隐藏成本,请查看 Metabase Cloud

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

如果您正在尝试升级 Docker 上的 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

启动完成后,您可以在 https://:3000 访问您的开源 Metabase。

要运行您的开源 Metabase 在其他端口,例如端口 12345

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

Pro 或 Enterprise 快速入门

如果您拥有 Metabase 的 Pro 或 Enterprise 版本许可证令牌,并且想在本地运行 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

启动完成后,您可以在 https://:3000 访问您的 Pro 或 Enterprise Metabase。

要运行您的 Pro 或 Enterprise Metabase 在其他端口,例如端口 12345

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

生产环境安装

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

如果您想在生产环境中运行 Metabase,您需要将应用程序数据存储在 生产级数据库 中。

一旦您准备好一个数据库(例如 Postgres)供 Metabase 存储其应用程序数据,您只需向 Metabase 提供连接信息和凭据,以便 Metabase 可以连接到它。

在生产环境中运行 Docker

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

createdb metabaseappdb

无需添加任何表;Metabase 将在启动时创建它们。假设该数据库可通过 my-database-host:5432 访问,用户名是 name,密码是 password

这是一个示例 Docker 命令,用于指示 Metabase 使用该数据库

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 文件 中设置了正确的条目。

迁移到生产环境安装

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

示例 Docker compose YAML 文件

这是一个使用 PostgreSQL 数据库 metabaseappdb 运行 Metabase 的示例 docker-compose.yml 文件

这是一个示例文件,不适用于在生产环境中运行 Metabase。请参阅我们的 如何在生产环境中运行 Metabase 指南。

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://:3000/api/health || exit 1
      interval: 15s
      timeout: 5s
      retries: 5
  postgres:
    image: postgres:16
    container_name: postgres
    hostname: postgres
    environment:
      POSTGRES_USER: metabase
      POSTGRES_DB: metabaseappdb
      POSTGRES_PASSWORD: mysecretpassword
    volumes:
      - ./pg_data:/var/lib/postgresql/data
    networks:
      - metanet1
networks:
  metanet1:
    driver: bridge

其他 Docker 维护和配置

自定义 Metabase Jetty 服务器

您可以通过在 Docker run 命令中设置环境变量来使用 自定义 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 时区设置为您希望所有报告显示的时区。您可以通过简单地指定 Metabase 启动脚本拾取的 JAVA_TIMEZONE 环境变量来完成此操作。例如

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,则使用 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 目录,然后
  • 将该目录绑定,使其可供 Metabase 作为路径 /plugins 访问(使用 --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 在启动容器之前可以在内存中读取和加载它们。

这是一个启动 Metabase Docker 容器的示例 docker-compose.yml 文件,其中包含连接到 PostgreSQL 数据库的 secrets。

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

  • db_user.txt
  • db_password.txt

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

注意,具有 secret 的环境变量都附加了“_FILE”

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://: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 指南。

故障排除

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

继续设置

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

阅读其他版本的 Metabase 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档? 提议更改。
© . This site is unofficial and not affiliated with Metabase, Inc.