Docker 构建、镜像和标签
Apache Superset 社区广泛使用 Docker 进行开发、发布和 Superset 生产化。本页面详细介绍了我们的 Docker 构建和标签命名方案,以帮助用户浏览我们的产品。
镜像是使用 GitHub Actions 构建并推送到 Superset Docker Hub 仓库 的。不同的镜像集在不同的时间构建和/或发布。
- 已发布版本 (
release
): 使用诸如3.0.0
和latest
之类的标签发布。 - 拉取请求迭代 (
pull_request
): 对于每个拉取请求,虽然我们积极构建 docker 来验证构建,但出于安全原因我们不会发布这些镜像,我们只执行docker build --load
- 合并到主分支 (
push
): 导致新的 SHA,带有master
前缀的标签,表示最新的master
版本。
构建预设
我们有一组构建“预设”,每个预设都表示构建参数的组合,主要指向构建的不同目标层和/或基础镜像。
以下是通过 build_docker.py
脚本公开的构建预设
lean
: 默认 Docker 镜像,包括前端和后端。没有构建预设的标签都是 lean 构建(例如:latest
、4.0.0
、3.0.0
等)。lean
构建不包含数据库驱动程序,这意味着您需要安装自己的驱动程序。这适用于分析数据库**和元数据数据库**。您可能需要根据您为安装选择的元数据数据库,以及连接到您的分析数据库所需的驱动程序,分别安装mysqlclient
或psycopg2-binary
。dev
: 用于开发,包含无头浏览器、开发相关实用程序和 root 访问权限。这包括一些常用的数据库驱动程序,如mysqlclient
、psycopg2-binary
以及一些用于开发/CI 的其他驱动程序。py311
,例如,Py311: 与 lean 类似,但使用不同的 Python 版本(本例中为 3.11)。ci
: 用于某些 CI 工作负载。websocket
: 用于支持高级功能的 Superset 集群。dockerize
: 由 Helm 使用。
关键标签示例
latest
: 最新官方发布版本构建latest-dev
: 最新官方发布版本构建的-dev
镜像,包含无头浏览器和 root 访问权限。master
: 来自master
分支的最新构建,隐含 lean 构建预设master-dev
: 与master
类似,但包含无头浏览器和 root 访问权限。pr-5252
: PR 5252 中的最新提交。30948dc401b40982cb7c0dbf6ebbe443b2748c1b-dev
: 此特定 SHA 的构建,可能来自master
合并或发布。websocket-latest
: 用于 Superset 集群的 WebSocket 镜像。
有关构建矩阵和标签约定的见解或修改,请查看 build_docker.py 脚本和 docker.yml GitHub 操作。
Dockerfile 中的关键 ARGs
BUILD_TRANSLATIONS
: 是否将翻译构建到镜像中。对于前端构建,这告诉 webpack 从moment-timezone
库中剔除所有除en
之外的语言环境。对于后端,这将跳过编译*.po
翻译文件DEV_MODE
: 是否跳过前端构建,这在我们docker-compose
开发设置中使用,我们挂载本地卷并使用webpack
在--watch
模式下构建,这意味着当您更改本地文件系统中的代码时,来自用于此目的 docker 镜像中的 webpack 将不断重新构建前端。此 ARG 使初始docker-compose
构建所需的时间和资源更少INCLUDE_CHROMIUM
: 是否在后端构建中包含 chromium,以便将其用作与“警报和报告”以及缩略图生成相关的无头浏览器INCLUDE_FIREFOX
: 与上述相同,但针对 firefoxPY_VER
: 指定 python 后端的基础镜像,如果您不处理向前或向后兼容性,我们建议不要更改此设置
缓存
为了加速构建,我们遵循 Docker 最佳实践,并使用 apache/superset-cache
。
关于数据库驱动程序
我们的 docker 镜像几乎没有或完全没有数据库驱动程序支持,因为每个环境都需要不同的驱动程序,维护一个具有广泛数据库支持的构建既具有挑战性(数十个数据库、python 驱动程序和操作系统依赖项),也效率低下(更长的构建时间、更大的镜像、更低的层缓存命中率等)。
对于生产用例,我们建议您派生我们的 lean
镜像并添加您需要的数据库的数据库支持。
关于支持不同的平台(即 arm64 和 amd64)
目前所有自动构建都是多平台的,同时支持 linux/arm64
和 linux/amd64
。这使得 helm
和 docker compose
之类的高级构造能够指向这些镜像,并且本身也成为多平台的。
拉取请求和主分支构建是每个平台一个镜像,这样可以并行化它们,并且这些构建的构建矩阵更加稀疏,因为我们不需要在每个平台上构建每个构建预设,并且通常可以在此选择性更强。对于这些构建,我们在适用的情况下将标签后缀为 -arm
。
使用苹果硅
苹果公司当前一代的计算机使用 ARM 架构的 CPU,在 MAC 上运行的 Docker 似乎需要 linux/arm64/v8
(至少一个用户的 M2 是这样配置的)。将环境变量 DOCKER_DEFAULT_PLATFORM
设置为 linux/amd64
似乎在利用和构建此处提供的 Superset 构建方面发挥作用。
export DOCKER_DEFAULT_PLATFORM=linux/amd64
可以假设,linux/arm64/v8
会更适合这一代芯片,但与 ARM 生态系统中的其他芯片的兼容性较差。