Skip to main content

Docker 构建、镜像与标签

Apache Superset 社区在开发、发布以及将 Superset 投入生产的过程中,大量采用了 Docker 技术。 此页面深入解析了我们关于 Docker 构建和标签命名的策略,旨在辅助用户理解并掌握我们的服务内容。

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

  • 已发布的版本 (release): 使用如 3.0.0latest 等标签进行发布。
  • 拉取请求迭代 (pull_request): 对于每个拉取请求,虽然我们会积极构建 Docker 来验证构建过程,但由于安全原因,我们不会发布这些镜像,仅执行 docker build --load
  • 主分支合并 (push): 导致新的 SHA 值产生,其标签会以 master 开头,代表最新的 master 版本。

构建预设

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

以下是通过 build_docker.py 脚本公开的构建预设:

  • lean: 默认的 Docker 镜像,包括前端和后端。没有指定构建预设的标签即为精简构建,例如 latest
  • dev: 适用于开发环境,包含无头浏览器、开发相关工具及 root 访问权限。
  • py311,例如 Py311:与精简构建类似,但使用不同版本的 Python(在此例中为 3.11)。
  • ci:针对特定的持续集成工作负载。
  • websocket:适用于支持高级特性的 Superset 集群。
  • dockerize:由 Helm 使用。

关键标签示例

  • latest: 最新的官方发布构建
  • latest-dev: 最新官方发布构建的 -dev 镜像,包含无头浏览器和 root 访问权限。
  • master: 来自 master 分支的最新构建,默认为 lean 构建预设。
  • master-dev: 类似于 master,但额外包含无头浏览器和 root 访问权限。
  • pr-5252: 拉取请求 5252 中的最新提交。
  • 30948dc401b40982cb7c0dbf6ebbe443b2748c1b-dev: 特定 SHA 的构建,可能是来自 master 分支的合并,或是某个发布版本。
  • websocket-latest: 用于 Superset 集群的 WebSocket 镜像。

若需深入了解构建矩阵或标签约定的修改细节, 请查阅 build_docker.py 脚本以及 docker.yml GitHub 动作。

缓存

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

关于数据库驱动程序

我们的 Docker 镜像几乎不包含数据库驱动程序的支持,因为每个环境所需的驱动程序各不相同, 而维护一个具有广泛数据库支持的构建既具挑战性(涉及数十种数据库、Python 驱动程序和操作系统依赖项)又效率低下(构建时间更长、镜像体积更大、缓存命中率更低等)。

对于生产环境的使用场景,我们建议您基于我们的 lean 镜像进行扩展,并为所需的数据库添加支持。

关于支持不同平台(特别是 arm64 和 amd64)

当前所有自动化的构建都是多平台的,同时支持 linux/arm64linux/amd64。 这使得更高层次的构造如 helm 和 docker-compose 能够指向这些镜像,从而实现自身的多平台兼容性。

对于拉取请求和主分支的构建,它们是按平台单个镜像构建的,以便可以并行处理。 这些构建的矩阵更为稀疏,因为我们无需在每个平台上构建每个构建预设,通常在这里可以更具选择性。 对于这类构建,我们会在适用的情况下,在标签后缀加上 -arm

与 Apple Silicon 平台协作

苹果当前一代计算机采用基于 ARM 的 CPU, 且在 MAC 上运行的 Docker 似乎要求使用 linux/arm64/v8(至少有一位用户的 M2 设备就是如此配置)。 将环境变量 DOCKER_DEFAULT_PLATFORM 设置为 linux/amd64 似乎能在利用现有资源的基础上, 有效构建 Superset 提供的镜像。

export DOCKER_DEFAULT_PLATFORM=linux/amd64

理论上,linux/arm64/v8 对这一代芯片的优化可能更好, 但在整个 ARM 生态系统中的兼容性可能较低。