在Docker上运行Metabase
Metabase通过Dockerhub提供官方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://127.0.0.1:3000
访问您的开源 Metabase。
要使用不同的端口(例如端口 12345)运行您的开源 Metabase
docker run -d -p 12345:3000 --name metabase metabase/metabase
Pro 或企业版快速入门
如果您有 Metabase Pro 或企业版的许可证令牌,并希望在本地运行 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://127.0.0.1:3000
访问您的 Pro 或企业版 Metabase。
要使用不同的端口(例如端口 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
。
以下是一个示例 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 文件
以下是一个示例 docker-compose.yml
文件,用于使用 PostgreSQL 数据库 metabaseappdb
运行 Metabase。
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 特定的环境变量
- 设置 Java 时区
- 复制应用程序数据库
- 挂载映射的文件存储卷
- 如果停止了您的容器,请获取您的配置
- 添加外部依赖项或插件
- 使用Docker Secrets隐藏敏感参数
- 故障排除
- 继续设置
自定义 Metabase Jetty 服务器
您可以通过在Docker运行命令中设置环境变量,使用自定义Metabase Jetty Web服务器中的任何自定义设置。
Docker 特定的环境变量
除了标准自定义设置之外,还有两个与Docker相关的环境变量 MUID
和 MGID
,它们用于设置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
。您可以使用以下命令将此目录从容器中复制出来(用实际的容器ID或名称CONTAINER_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
目录, - 并将该目录绑定以使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就可以在启动容器之前在内存中读取和加载它们。
以下是一个示例 docker-compose.yml
文件,用于启动一个带有连接到 PostgreSQL 数据库的密钥的 Metabase Docker 容器。
除了这个示例 yml 文件外,您还需要创建两个文件
db_user.txt
db_password.txt
这些文件应与 docker-compose.yml
在同一目录中。将 db_user
放入 db_user.txt
文件中,将 db_password 放入 db_password.txt
文件中。
注意具有秘密的环境变量上的“_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
我们目前支持以下 环境变量 作为秘密使用
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 容器能够读取文件并将内容用作秘密,环境变量名称需要附加一个“_FILE”,如上所述。
故障排除
请参阅 故障排除指南 中的运行 Metabase。
继续设置
现在您已经安装了 Metabase,是时候 设置它并将其连接到您的数据库 了。
阅读有关其他 Metabase 版本的文档。