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
模块。镜像中默认不安装
pipx
和mssql-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/airflow
或apache/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.8
和apache/airflow:slim-2.9.0-python-3.8
镜像来使用 Python 3.8,因此尽管此更改可能具有破坏性,但很容易切换回先前的行为。
PIP_USER
标志已被移除,并被指向 Airflow 安装位置~/.local
的VIRTUAL_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 镜像添加
libxmlsec1
和libxmlsec1-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 * 添加对
.piprc
和pip.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.2
和2.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
移除对
worker
和flower
命令的 celery 后端等待,而不仅仅是scheduler
和celery
在请求升级时,移除 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.2
和2.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 到
bash
或python
。如果
airflow
命令被指定为run
命令的第一个参数,则移除它。
- 2.0.0
基于 Debian Buster 的镜像初始版本。
发布镜像后的更改¶
有时我们的镜像需要使用更新的 Dockerfile
或约束重新生成。当发现问题或我们的依赖项发布了破坏性更改,导致已发布的镜像无效时,就会发生这种情况;重新生成镜像使其再次可用。尽管在这种情况下我们无法保证 100% 的向后兼容性,但我们至少在此处记录下来,以便受影响的用户可以找到更改的原因。
日期 |
受影响的镜像 |
潜在的破坏性更改 |
原因 |
拉取请求/问题的链接 |
---|---|---|---|---|
2024 年 8 月 2 日 |
2.9.3 |
|
FAB 提供者注销在 2.9.3 中不起作用 |
|
2024 年 3 月 12 日 |
2.8.3 |
|
这两个依赖项都导致了破坏性更改 |
https://github.com/apache/airflow/pull/37748 https://github.com/apache/airflow/pull/37701 |
2023 年 12 月 16 日 |
所有 2..* |
|
密钥过期风波后,MySQL 仓库已移除 |
|
2022 年 6 月 17 日 |
2.2.5 2.3.0-2.3.2 |
|
Flask App Builder 与 Authlib >= 1.0.0 不兼容 |
|
2022 年 1 月 18 日 |
所有 2.2.*, 2.1.* |
|
MySQL 在 2022 年 1 月 17 日更改了用于签署其软件包的密钥 |