Airflow 峰会 2025 将于 10 月 07-09 日举行。立即注册获取早鸟票!

Dockerfile 更新日志

Dockerfile 在特性和向后兼容性方面,并未严格遵循 Apache Airflow 的 SemVer 方法。尽管 Airflow 代码严格遵循此方法,但 Dockerfile 实际上是一种通过标准容器方法为用户提供便捷打包 Airflow 的方式,因此偶尔会在构建过程或镜像入口点中发生一些更改,需要对使用或构建方式进行微调。

下面的更新日志描述了 Airflow 团队发布的每个版本 docker 镜像中引入的更改。

注意:

下面的更新日志仅涉及在 Airflow DockerHub 上发布的便捷生产镜像。在那里发布的镜像通常是使用随 Airflow 一同发布的 Dockerfile 构建的。但是,您可以自由地获取 Airflow 最新发布的 Dockerfile,并用它来构建 Airflow 2 系列中任何 Airflow 版本的镜像。无法保证此方法有效,但如果有效,您就可以使用该镜像中的最新功能来构建先前 Airflow 版本的镜像。

Airflow 3.0

  • virtualenv 包不再安装在参考容器中。Airflow 3 和标准提供者依赖于 Python 标准库中的 venv 模块。

  • 镜像中默认不安装 pipxmssql-cli。我们推荐使用 uv tool 代替 pipx,且 mssql-cli 默认不在镜像中使用,因为我们不再支持 mssql 元数据。

  • INSTALL_PACKAGES_FROM_CONTEXT 参数更改为 INSTALL_DISTRIBUTIONS_FROM_CONTEXT

  • 参数 UPGRADE_INVALIDATION_STRING 重命名为 UPGRADE_RANDOM_INDICATOR_STRING

Airflow 2.10

  • 镜像不再支持 Debian-Bullseye(11)。镜像基于 Debian-Bookworm (12)。

Airflow 2.9

  • “latest” 镜像(即使用 apache/airflowapache/airflow:slim-latest 时的默认 Airflow 镜像)现在使用最新支持的 Python 版本。以前它使用的是“默认”Python 版本,即 Airflow 2.8 时的 Python 3.8。随着 Airflow 2.9.0 参考镜像的发布,镜像将使用 Python 3.12,因为这是 Airflow 2.9 系列最新支持的版本。用户可以通过使用 apache/airflow:2.9.0-python3.8apache/airflow:slim-2.9.0-python-3.8 镜像来使用 Python 3.8,因此尽管此更改可能具有破坏性,但很容易切换回先前的行为。

  • PIP_USER 标志已被移除,并被指向 Airflow 安装位置 ~/.localVIRTUAL_ENV 替代。这样一来,Airflow 的安装就被视为一个常规的虚拟环境,但与常规的 virtualenv 不同,~/.local 目录被视为 系统级别,当 worker 使用 --system-site-packages 标志动态创建 virtualenv 时,Airflow 安装及其中的所有包也会出现在新的 virtualenv 中。当您不使用该标志时,它们不会被复制到那里,这与设置 PIP_USER 是向后兼容的行为。

  • 镜像包含最新的 uv 二进制文件(发布时的最新版本)—— 它是 pip 的一个更快的新替代品。尽管镜像默认仍使用 pip,但您可以使用 uv 安装包,并且——实验性地——您还可以使用 --arg AIRFLOW_USE_UV=true 参数构建自定义镜像,这将使用 uv 执行安装。这是实验性支持,因为 uv 非常快,但在 Python 生态系统中也是一个非常新的特性。

  • 用于安装镜像的约束文件现在位于“${HOME}/constraints.txt”中——您可以使用它们在镜像中安装额外的包,而无需查找应使用哪些约束。

  • 镜像中添加了 libev 库,因为 Python 3.12 的 cassandra 驱动程序需要它,同时 libev 也将在其他 Python 版本中使用,作为 cassandra 驱动程序处理事件的更健壮和更快的方式。

Airflow 2.8

  • 2.8.3

    • gosu 二进制文件已从镜像中移除。对于依赖 gosu 在容器中更改用户的用户来说,这可能是一个破坏性更改。移除 gosu 二进制文件是因为它链接到较旧的 Go 标准库,是安全漏洞的来源。

    • smtp 提供者现在默认包含在镜像的已安装提供者列表中。

  • 2.8.1

    • 修复了 MySQL 客户端库中的一个差异。在 2.8.0 中,如果在构建自定义 X86 镜像时未指定 INSTALL_MYSQL_CLIENT_TYPE 构建参数,默认情况下包会使用 MariaDB 库编译,但最终镜像中安装的是 MySQL 库。

  • 2.8.0

    • 向 dev PROD 镜像添加 libxmlsec1libxmlsec1-dev 库,向 runtime PROD 镜像添加 libxmlsec1 库,因为 python3-saml 库需要它们。

    • 在 2.8.0 中,镜像基于 Debian Bookworm 而不是 Debian Bullseye。这在构建自定义镜像时可能会导致一些问题。建议您确保您的系统级依赖项在 Debian Bookworm 上正常工作。尽管 Airflow 2.8.0 的所有参考镜像都是基于 Debian Bookworm 构建的,但在 2.8.0 中仍然可以按照以下方式构建已弃用的基于 Debian Bullseye 的自定义镜像:

    • 默认情况下,镜像现在安装了“MariaDB”客户端。之前的镜像安装了“MySQL”客户端。MariaDB 客户端是“MySQL”客户端的直接替代品,并且与 MySQL 兼容。对于在其镜像中使用 MySQL 客户端的用户来说,这可能是一个破坏性更改,但这些应该是非常特殊的情况,绝大多数用户应该不会看到任何差异。用户仍然可以通过设置 INSTALL_MYSQL_CLIENT_TYPE=mysql 构建参数来使用 MySQL 客户端并构建自定义 X86 镜像。ARM 镜像始终使用 MariaDB 客户端,此参数会被忽略。“mysql” apt 仓库已从 /etc/apt/sources.list.d/ 中移除,如果您在扩展镜像时想从该仓库安装任何东西,您需要在 Dockerfile 中手动添加正确的密钥和仓库,遵循 A Quick Guide to Using the MySQL APT repository 中的说明。

Airflow 2.7

  • 2.7.3

    • 添加实验性功能,用于在构建自定义镜像时通过 INSTALL_MYSQL_CLIENT_TYPE 构建参数选择 MySQL 客户端库的类型。mysql 用于从 Oracle APT 仓库 安装 MySQL 客户端库,mariadb 用于从 MariaDB 仓库 安装 MariaDB 客户端库。MySQL 客户端库的选择仅在 AMD64 (x86_64) 上可用,对于 ARM docker 镜像,它将始终安装 MariaDB 客户端。

    • 镜像中的 Docker CLI 版本已提升到 24.0.6 版本。

    • 本地构建已启用 PIP 缓存,以加快本地自定义镜像构建速度。

  • 2.7.0

    • 截至目前,Python 3.7 不再受 Python 社区支持。因此,要使用 Airflow 2.7.0,您必须确保您的 Python 版本是 3.8、3.9、3.10 或 3.11。

Airflow 2.6

  • 2.6.3

    • 向 runtime PROD 镜像添加 libgeos-dev 库,因为 ARM 镜像上的 BigQuery 库需要它

  • 2.6.0

    • 默认安装 Snowflake 提供者

    • ARM 实验性镜像通过 MariaDB 客户端库添加了对 MySQL 的支持。

Airflow 2.5

  • 2.5.1

    • ARM 实验性镜像添加了对 MSSQL 的支持

  • 2.5.0

    • docker CLI 二进制文件现在默认添加到镜像中(在 PATH 中可用)。使用的版本是 20.10.9。

Airflow 2.4

  • 2.4.0

    • 您可以在通过 ADDITIONAL_PIP_INSTALL_FLAGS 构建参数构建镜像时指定额外的 pip install 标志。

    • 已取消对 Debian Buster 的支持,包括构建自定义镜像的可能性,因为 Debian Buster 已达到生命周期结束。

Airflow 2.3

  • 2.3.0

    • Airflow 2.3 的 Dockerfile 现在更好地优化了缓存并支持“独立”构建,这意味着您可以将 Dockerfile 复制到任何文件夹并开始构建自定义镜像。然而,这需要使用 Buildkit 来构建镜像,因为我们开始使用只有在 Buildkit 中才可用的功能。可以通过将 DOCKER_BUILDKIT=1 设置为环境变量,或者通过安装 buildx 插件 并运行 docker buildx build 命令来实现。

    • MySQL 在 ARM 上通过 MariaDB 客户端库获得实验性支持

    • 添加 Python 3.10 支持

    • 切换到基于 Debian Bullseye 的镜像。Debian Buster 已弃用,仅可用于定制镜像构建。

    • 添加多平台支持 (AMD64/ARM64),以适应 MacOS M1 用户

    • 控制是否从上下文文件安装包和 Airflow 的构建参数已统一

    • INSTALL_FROM_PYPI 参数已移除 - 现在会自动检测。

    • INSTALL_FROM_DOCKER_CONTEXT_FILES 参数更改为 INSTALL_PACKAGES_FROM_CONTEXT

Airflow 2.2

  • 2.2.4 * 添加对 .piprcpip.conf 自定义的都支持 * 添加 ArtifactHub 标签以更好地发现镜像 * 更新默认 Python 镜像为 3.7 * 使用 Buildkit 构建镜像(可选) * 修复在 Azure 上构建镜像时出现的 text file busy 错误

  • 2.2.3 * 无更改

  • 2.2.2 * 无更改

  • 2.2.1 * 解决 libstdcpp TLS 错误问题

  • 2.2.0 * 从 Airflow 镜像中移除 AIRFLOW_GID (5000)(对使用此功能的用户来说可能是破坏性更改) * 添加了 Quick-start docker compose 的警告 * 修复 celery worker 的温和关闭(信号传播) * 向 PROD 镜像添加 Oauth 库 * 添加 Python 3.9 支持

Airflow 2.1

  • MySQL 在 2022 年 2 月 17 日更改了用于签署其软件包的密钥。这导致所有已发布的镜像在扩展时失败。结果,在 2021 年 2 月 18 日,我们重新发布了所有 2.22.1 镜像,使用了包含新签名密钥的最新版本 Dockerfile

    因此,部分 2.1 镜像的行为发生了细微变化(详情如下)详细问题见 此处

注意:

请注意,以下更改在 2022 年 2 月 18 日镜像刷新之前有效。由于所有镜像都在 2 月 18 日使用与 2.1.4 相同的 Dockerfile 进行了刷新,因此 2.1.1 -> 2.1.3 的更改实际上适用于 2.1.* 系列中的所有镜像。刷新的镜像也添加了这些修复。

  • 所有在 2022 年 2 月 18 日刷新的 2.1.* 镜像版本都应用了以下修复:* 修复在 Azure 上构建镜像时出现的 text file busy 错误 * 解决 libstdcpp TLS 错误问题 * 从 Airflow 镜像中移除 AIRFLOW_GID (5000)(对使用此功能的用户来说可能是破坏性更改) * 添加了 Quick-start docker compose 的警告 * 向 PROD 镜像添加 Oauth 库

原始镜像更新日志(2022 年 2 月 18 日刷新前)

  • 2.1.4
    • 解决 libstdcpp TLS 错误问题

    • 修复了连接 URL 中端口号的检测问题

    • 改进了 quick-start-docker compose 的警告

    • 修复 celery worker 的温和关闭(信号传播)

  • 2.1.3
    • 修复了自动创建用户时使用非弃用的 create user 而不是 user_create

    • 移除对 workerflower 命令的 celery 后端等待,而不仅仅是 schedulercelery

    • 在请求升级时,移除 Airflow 1.10 中已弃用的 airflow upgradedb 命令

    • 添加 Python 3.9 支持

  • 2.1.2
    • 无更改

  • 2.1.1
    • 修复了缺少默认命令导致的失败(未传递命令时失败)

    • 添加了 _PIP_ADDITIONAL_REQUIREMENTS 开发特性

  • 2.1.0
    • 取消设置默认 PIP_USER 变量 - 这导致 PythonVirtualEnv 失败

Airflow 2.0

  • MySQL 在 2022 年 2 月 17 日更改了用于签署其软件包的密钥。这导致所有已发布的镜像在扩展时失败。结果,在 2021 年 2 月 18 日,我们重新发布了所有 2.22.1 镜像,使用了包含新签名密钥的最新版本 Dockerfile

    由于这个原因,2.0.2 镜像的行为没有变化,详细问题见 此处。仅重新生成了 2.0.2 镜像,因为 2.0.1 和 2.0.0 版本几乎不使用,不太可能有人会想要扩展这些镜像。扩展 2.0.1 和 2.0.0 镜像将导致“缺少密钥”的失败。

  • 2.0.2
    • root 用户设置正确的 PYTHONPATH。允许以 root 用户运行镜像。

    • 警告:如果在运行镜像时为 airflow 用户使用了已弃用的 5000 组 ID(OpenShift 兼容性应为 0)。如果将 5000 组与其他任何用户一起使用,则会失败(无论如何都不会工作,但会显示神秘错误)。

    • 默认将 umask 设置为 002,这样您就可以实际更改用于运行镜像的用户 ID(OpenShift 兼容性所需)。

    • 如果 CONNECTION_CHECK_MAX_COUNT 等于 0,则跳过检查 DB 和 celery 后端。

  • 2.0.1
    • 检查 DB 可用性时避免反向 IP 查找。这有助于解决配置错误的 docker 引擎上的长时间延迟问题。

    • 添加 redis 和 amqp broker 端口的自动检测。

    • 修复了 URL 中所有用户/密码组合的检测问题 - 有助于自动检测端口和测试连接。

    • 进入镜像时自动创建管理员用户的可能性。

    • 当使用 airflow 以外的其他用户时,自动创建系统用户。OpenShift 兼容性所需。

    • 如果指定为参数,允许 exec 到 bashpython

    • 如果 airflow 命令被指定为 run 命令的第一个参数,则移除它。

  • 2.0.0
    • 基于 Debian Buster 的镜像初始版本。

发布镜像后的更改

有时我们的镜像需要使用更新的 Dockerfile 或约束重新生成。当发现问题或我们的依赖项发布了破坏性更改,导致已发布的镜像无效时,就会发生这种情况;重新生成镜像使其再次可用。尽管在这种情况下我们无法保证 100% 的向后兼容性,但我们至少在此处记录下来,以便受影响的用户可以找到更改的原因。

日期

受影响的镜像

潜在的破坏性更改

原因

拉取请求/问题的链接

2024 年 8 月 2 日

2.9.3

  • apache-airflow-providers-fab 从 1.2.1 升级到 1.2.2

FAB 提供者注销在 2.9.3 中不起作用

https://github.com/apache/airflow/issues/40922

2024 年 3 月 12 日

2.8.3

  • 镜像已使用新依赖项刷新(pandas < 2.2 和 SMTP 提供者 1.6.1)

这两个依赖项都导致了破坏性更改

https://github.com/apache/airflow/pull/37748 https://github.com/apache/airflow/pull/37701

2023 年 12 月 16 日

所有 2..*

  • AIRFLOW_GID 500 已移除

  • MySQL apt 仓库密钥已更改。

密钥过期风波后,MySQL 仓库已移除

https://github.com/apache/airflow/issues/36231

2022 年 6 月 17 日

2.2.5

2.3.0-2.3.2

  • Authlib 库从 1.0.1 版本降级到 0.15.5 版本

Flask App Builder 与 Authlib >= 1.0.0 不兼容

https://github.com/apache/airflow/pull/24516

2022 年 1 月 18 日

所有 2.2.*, 2.1.*

  • AIRFLOW_GID 500 已移除

  • MySQL apt 仓库密钥已更改。

MySQL 在 2022 年 1 月 17 日更改了用于签署其软件包的密钥

https://github.com/apache/airflow/pull/20912

此条目有帮助吗?