Dockerfile 更新日志

在特性和向后兼容性方面,Dockerfile 并不严格遵循 Apache Airflow 的 语义化版本 方法。虽然 Airflow 代码严格遵循它,但 Dockerfile 实际上是为用户提供一种方便打包的 Airflow 的方式,它使用标准的容器方法,因此有时在构建过程或镜像的入口点中会有一些更改,需要稍微调整如何使用或构建它。

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

注意

下面的更新日志仅涉及在 Airflow DockerHub 上发布的便捷生产镜像。在那里发布的镜像通常是使用与 Airflow 一起发布的 Dockerfile 构建的。但是,您可以自由地从 Airflow 中获取最新发布的 Dockerfile,并使用它为 Airflow 2 系列的任何 Airflow 版本构建镜像。不能保证它会工作,但如果它确实工作,那么您可以使用该镜像的最新功能为以前的 Airflow 版本构建镜像。

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 发布的 Airflow 参考镜像,这些镜像将使用 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 标志被删除,并替换为指向 ~/.localVIRTUAL_ENV,Airflow 安装在那里。这产生了将 Airflow 安装视为常规虚拟环境的效果,但与常规虚拟环境不同,~/.local 目录被视为 系统 级别,当 worker 使用 --system-site-packages 标志动态创建虚拟环境时,Airflow 安装和其中的所有包也会出现在新的虚拟环境中。当您不使用该标志时,它们不会被复制到那里,这与设置了 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

    • libxmlsec1libxmlsec1-dev 库添加到开发 PROD 镜像,并将 libxmlsec1 库添加到运行时 PROD 镜像,因为 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 构建参数并构建自定义 X86 镜像来使用 MySQL 客户端。ARM 镜像始终使用 MariaDB 客户端,此参数将被忽略。 “mysql” apt 存储库已从 /etc/apt/sources.list.d/ 中删除,如果您想在扩展镜像时从此存储库安装任何内容,则需要在 Dockerfile 中手动添加正确的密钥和存储库,按照 使用 MySQL APT 存储库的快速指南 中的说明进行操作。

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

    • libgeos-dev 库添加到运行时 PROD 镜像,因为 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 命令来完成此操作。

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

    • 添加 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)(可能对使用它的用户造成破坏性更改) * 为快速入门 docker compose 添加警告 * 修复 Celery 工作节点的暖关闭(信号传播) * 将 Oauth 库添加到 PROD 镜像 * 添加 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)(可能对使用它的用户造成破坏性更改)* 为快速入门 docker compose 添加警告 * 将 Oauth 库添加到 PROD 镜像

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

  • 2.1.4
    • 解决 libstdcpp TLS 错误的问题

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

    • 改进了快速入门 docker compose 的警告

    • 修复 Celery 工作节点的暖关闭(信号传播)

  • 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,则跳过检查数据库和 Celery 后端

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

    • 添加 Redis 和 AMQP 代理端口的自动检测

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

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

    • 当使用除 airflow 之外的用户时,自动创建系统用户。与 OpenShift 兼容所必需

    • 如果指定为参数,则允许执行 bashpython

    • 如果将 airflow 命令指定为 run 命令的第一个参数,则删除该命令

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

发布镜像后的更改

有时,我们的镜像需要使用较新的 Dockerfiles 或约束条件重新生成。当发现问题或依赖项发布了破坏性更改,导致已发布的镜像失效时,就会发生这种情况,而重新生成镜像使其再次可用。虽然我们不能保证发生这种情况时 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

此条目是否有帮助?