跳到主要内容

Docker 构建、镜像和标签

Apache Superset 社区广泛使用 Docker 进行 Superset 的开发、发布和生产部署。本页详细介绍了我们的 Docker 构建和标签命名方案,以帮助用户了解我们的产品。

镜像通过 GitHub Actions 构建并推送到 Superset Docker Hub 仓库。不同集合的镜像在不同时间构建和/或发布:

  • 已发布的版本 (release):使用如 5.0.0latest 标签发布。
  • 拉取请求迭代 (pull_request):对于每个拉取请求,我们会积极构建 docker 以验证构建,但出于安全原因,我们不会发布这些镜像,我们只是进行 docker build --load
  • 合并到主分支 (push):产生新的 SHA,标签以 master 为前缀,表示最新的 master 版本。

构建预设

我们有一组构建“预设”,每个预设代表构建参数的组合,主要指向构建的不同目标层和/或基础镜像。

以下是通过 supersetbot docker 工具公开的构建预设:

  • lean:默认的 Docker 镜像,包括前端和后端。没有构建预设的标签是 lean 构建(例如:latest5.0.04.1.2 等)。lean 构建不包含数据库驱动,这意味着您需要自行安装。这适用于分析数据库以及元数据数据库。您可能需要根据您为安装选择的元数据数据库,分层安装 mysqlclientpsycopg2-binary,以及连接到您的分析数据库所需的驱动程序。
  • dev:用于开发,包含无头浏览器、开发相关工具和 root 访问权限。这包括一些常用的数据库驱动,如 mysqlclientpsycopg2-binary 以及其他用于开发/CI 的驱动。
  • py311,例如 Py311:与 lean 类似,但使用不同的 Python 版本(本例中为 3.11)。
  • ci:用于某些 CI 工作负载。
  • websocket:用于支持高级功能的 Superset 集群。
  • dockerize:由 Helm 在 initContainers 中使用,用于等待数据库依赖项可用。

主要标签示例

  • latest:最新的官方发布构建
  • latest-dev:最新官方发布构建的 -dev 镜像,带有无头浏览器和 root 访问权限。
  • mastermaster 分支的最新构建,默认为 lean 构建预设。
  • master-dev:与 master 类似,但包含无头浏览器和 root 访问权限。
  • pr-5252:PR 5252 中的最新提交。
  • 30948dc401b40982cb7c0dbf6ebbe443b2748c1b-dev:此特定 SHA 的构建,可能来自 master 合并或发布。
  • websocket-latest:用于 Superset 集群的 WebSocket 镜像。

有关构建矩阵和标签约定,请查看 supersetbot docker 子命令和 docker.yml GitHub action。

构建您自己的生产 Docker 镜像

每个 Superset 部署都需要一套自己的驱动程序,具体取决于数据仓库等,因此我们建议用户通过扩展 lean 镜像来构建自己的 Docker 镜像。

这是一个示例 Dockerfile。请按照行内注释对其进行自定义,以满足您所需的 Superset 版本和数据库驱动程序。注释中还指出,必须在您的配置文件中启用某个功能标志。

您可以使用 docker build -t mysuperset:latest .docker build -t ourcompanysuperset:5.0.0 . 来构建镜像。

# change this to apache/superset:5.0.0 or whatever version you want to build from;
# otherwise the default is the latest commit on GitHub master branch
FROM apache/superset:master

USER root

# Set environment variable for Playwright
ENV PLAYWRIGHT_BROWSERS_PATH=/usr/local/share/playwright-browsers

# Install packages using uv into the virtual environment
# Superset started using uv after the 4.1 branch; if you are building from apache/superset:4.1.x or an older version,
# replace the first two lines with RUN pip install \
RUN . /app/.venv/bin/activate && \
uv pip install \
# install psycopg2 for using PostgreSQL metadata store - could be a MySQL package if using that backend:
psycopg2-binary \
# add the driver(s) for your data warehouse(s), in this example we're showing for Microsoft SQL Server:
pymssql \
# package needed for using single-sign on authentication:
Authlib \
# openpyxl to be able to upload Excel files
openpyxl \
# Pillow for Alerts & Reports to generate PDFs of dashboards
Pillow \
# install Playwright for taking screenshots for Alerts & Reports. This assumes the feature flag PLAYWRIGHT_REPORTS_AND_THUMBNAILS is enabled
# That feature flag will default to True starting in 6.0.0
# Playwright works only with Chrome.
# If you are still using Selenium instead of Playwright, you would instead install here the selenium package and a headless browser & webdriver
playwright \
&& playwright install-deps \
&& PLAYWRIGHT_BROWSERS_PATH=/usr/local/share/playwright-browsers playwright install chromium

# Switch back to the superset user
USER superset

CMD ["/app/docker/entrypoints/run-server.sh"]

Dockerfile 中的主要 ARG

  • BUILD_TRANSLATIONS:是否将翻译构建到镜像中。对于前端构建,这会告诉 webpack 从 moment-timezone 库中剥离除 en 之外的所有语言环境。对于后端,这会跳过编译 *.po 翻译文件。
  • DEV_MODE:是否跳过前端构建,这用于我们的 docker-compose 开发设置,我们在此设置中挂载本地卷并使用 webpack--watch 模式构建,这意味着当您更改本地文件系统中的代码时,webpack 会从用于此目的的 docker 镜像中不断重建前端。此 ARG 使得初始 docker-compose 构建花费更少的时间和资源。
  • INCLUDE_CHROMIUM:是否在后端构建中包含 chromium,以便可以将其用作无头浏览器,用于“警报和报告”以及缩略图生成相关的工作负载。
  • INCLUDE_FIREFOX:同上,但针对 firefox。
  • PY_VER:指定 python 后端的基础镜像,如果您不从事向前或向后兼容性工作,我们不建议更改此设置。

缓存

为了加速构建,我们遵循 Docker 最佳实践并使用 apache/superset-cache

关于数据库驱动

我们的 docker 镜像提供的数据库驱动支持很少或根本没有,因为每个环境都需要不同的驱动,而且维护一个支持多种数据库的构建将是既具有挑战性(数十种数据库、Python 驱动和操作系统依赖)又效率低下(更长的构建时间、更大的镜像、更低的层缓存命中率等)。

对于生产用例,我们建议您派生我们的 lean 镜像并为您需要的数据库添加数据库支持。

关于支持不同平台(即 arm64 和 amd64)

目前所有自动化构建都是多平台的,支持 linux/arm64linux/amd64。这使得 helmdocker compose 等高级构造能够指向这些镜像,并有效地实现多平台。

拉取请求和 master 构建是每个平台一个镜像,这样它们可以并行化,并且这些构建的构建矩阵更稀疏,因为我们不需要在每个平台上构建每个构建预设,并且通常可以在这里更有选择性。对于这些构建,我们会在适用的情况下为标签添加 -arm 后缀。

使用 Apple 芯片

Apple 当前一代的计算机使用基于 ARM 的 CPU,在 MAC 上运行的 Docker 似乎需要 linux/arm64/v8(至少有一个用户的 M2 是这样配置的)。将环境变量 DOCKER_DEFAULT_PLATFORM 设置为 linux/amd64 似乎在利用和基于此处提供的 Superset 构建方面是可行的。

export DOCKER_DEFAULT_PLATFORM=linux/amd64

据推测,linux/arm64/v8 会针对这一代芯片进行更多优化,但在 ARM 生态系统中的兼容性会较差。