This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 5cdfa8571b0 Use Python 3.14 as the default Python of the 3.5.0 images
(#76800)
5cdfa8571b0 is described below
commit 5cdfa8571b0f273d6afe8452b66d379b33ea5410
Author: Jarek Potiuk <[email protected]>
AuthorDate: Tue Nov 10 10:53:19 2026 +0100
Use Python 3.14 as the default Python of the 3.5.0 images (#76800)
The default Python of the image is meant to be the newest Python version
that every provider installed in the regular image supports. All of them
support Python 3.14 - the only provider that excludes it is not part of the
image - so the default had fallen behind. This applies from Airflow 3.5.0
on; the 3.4 images keep Python 3.13 as their default.
Generated-by: Claude Opus 5
---
Dockerfile | 4 ++--
Dockerfile.ci | 4 ++--
dev/breeze/src/airflow_breeze/global_constants.py | 2 +-
docker-stack-docs/README.md | 8 ++++----
docker-stack-docs/build-arg-ref.rst | 2 +-
docker-stack-docs/build.rst | 4 ++--
docker-stack-docs/changelog.rst | 7 +++++++
.../docker-examples/customizing/add-build-essential-custom.sh | 2 +-
docker-stack-docs/docker-examples/customizing/custom-sources.sh | 2 +-
.../docker-examples/customizing/pypi-dev-runtime-deps.sh | 2 +-
.../docker-examples/customizing/pypi-extras-and-deps.sh | 2 +-
.../docker-examples/customizing/pypi-selected-version.sh | 2 +-
.../docker-examples/restricted/restricted_environments.sh | 2 +-
docker-stack-docs/index.rst | 8 ++++----
14 files changed, 29 insertions(+), 22 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 55f19f59395..012bbd74711 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -60,7 +60,7 @@ ARG AIRFLOW_VERSION="3.4.0"
#
# The FIPS-validated variants require a paid Docker subscription and cannot be
mirrored or made the
# default, but you can build a FIPS-compliant image by pointing the build at
one:
-# docker build . --build-arg
BASE_IMAGE="dhi.io/python:3.13.18-debian13-fips-dev"
+# docker build . --build-arg
BASE_IMAGE="dhi.io/python:3.14.10-debian13-fips-dev"
#
# AIRFLOW_IMAGE_FLAVOR="legacy" builds the image the way it was built before
the hardened base images:
# BASE_IMAGE is then a plain Debian image (for example "debian:bookworm-slim")
and Python
@@ -71,7 +71,7 @@ ARG AIRFLOW_VERSION="3.4.0"
# build fails if a version passed here does not match it. Breeze passes the
Python patchlevel that
# "breeze ci upgrade" last moved, so a new patch release also rebuilds the
legacy flavor.
ARG AIRFLOW_IMAGE_FLAVOR="hardened"
-ARG
BASE_IMAGE="ghcr.io/apache/airflow/base/python:3.13.18-debian13-dev@sha256:3a4e14a0dc4300490df0d33f49c6d5a1bc76bd7e48de1214656f5fd77a84504b"
+ARG
BASE_IMAGE="ghcr.io/apache/airflow/base/python:3.14.10-debian13-dev@sha256:e1c528dee57ce33c3192099679a1690a1541030f5137df3587d3ed0454a172b6"
# DEV_OS_DEPS_IMAGE / RUNTIME_OS_DEPS_IMAGE: the images the build and the
final image install their OS
# dependencies on. By default both are BASE_IMAGE and the build installs them
from the apt repositories.
diff --git a/Dockerfile.ci b/Dockerfile.ci
index d03aa9236d0..38fb9638373 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -28,8 +28,8 @@
#
# The FIPS-validated variants require a paid Docker subscription and cannot be
mirrored or made the
# default, but you can build a FIPS-compliant image by pointing the build at
one:
-# docker build . --build-arg
BASE_IMAGE="dhi.io/python:3.13.18-debian13-fips-dev"
-ARG
BASE_IMAGE="ghcr.io/apache/airflow/base/python:3.13.18-debian13-dev@sha256:3a4e14a0dc4300490df0d33f49c6d5a1bc76bd7e48de1214656f5fd77a84504b"
+# docker build . --build-arg
BASE_IMAGE="dhi.io/python:3.14.10-debian13-fips-dev"
+ARG
BASE_IMAGE="ghcr.io/apache/airflow/base/python:3.14.10-debian13-dev@sha256:e1c528dee57ce33c3192099679a1690a1541030f5137df3587d3ed0454a172b6"
# CI_OS_DEPS_IMAGE: the image the OS dependencies are installed on. By default
that is BASE_IMAGE and
# the build installs them from the apt repositories. Breeze passes the pinned
OS-dependencies image
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py
b/dev/breeze/src/airflow_breeze/global_constants.py
index 438ccaa17aa..51db919fbd4 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -81,7 +81,7 @@ APACHE_AIRFLOW_GITHUB_REPOSITORY = "apache/airflow"
ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS = ["3.11", "3.12", "3.13", "3.14"]
DEFAULT_PYTHON_MAJOR_MINOR_VERSION = ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS[0]
DEFAULT_PYTHON_MAJOR_MINOR_VERSION_FOR_IMAGES = (
- "3.13" # "highest complete" python version (where all providers are
included)
+ "3.14" # "highest complete" python version (where all providers are
included)
)
ALLOWED_ARCHITECTURES = [Architecture.X86_64, Architecture.ARM]
diff --git a/docker-stack-docs/README.md b/docker-stack-docs/README.md
index 925373ca0f1..a8b25ef8574 100644
--- a/docker-stack-docs/README.md
+++ b/docker-stack-docs/README.md
@@ -33,9 +33,9 @@ for all the supported Python versions.
You can find the following images there (Assuming Airflow version `3.5.0`):
-* `apache/airflow:latest` - the latest released Airflow image with default
Python version (3.12 currently)
+* `apache/airflow:latest` - the latest released Airflow image with default
Python version (3.14 currently)
* `apache/airflow:latest-pythonX.Y` - the latest released Airflow image with
specific Python version
-* `apache/airflow:3.5.0` - the versioned Airflow image with default Python
version (3.12 currently)
+* `apache/airflow:3.5.0` - the versioned Airflow image with default Python
version (3.14 currently)
* `apache/airflow:3.5.0-pythonX.Y` - the versioned Airflow image with specific
Python version
Those are "reference" regular images. They contain the most common set of
extras, dependencies and providers that are
@@ -45,9 +45,9 @@ You can also use "slim" images that contain only core Airflow
and are about half
but you need to add all the [Reference for package
extras](https://airflow.apache.org/docs/apache-airflow/stable/extra-packages-ref.html)
and providers that you need separately
via [Building the
image](https://airflow.apache.org/docs/docker-stack/build.html#build-build-image).
-* `apache/airflow:slim-latest` - the latest released Airflow
image with default Python version (3.12 currently)
+* `apache/airflow:slim-latest` - the latest released Airflow
image with default Python version (3.14 currently)
* `apache/airflow:slim-latest-pythonX.Y` - the latest released Airflow
image with specific Python version
-* `apache/airflow:slim-3.5.0` - the versioned Airflow image with
default Python version (3.12 currently)
+* `apache/airflow:slim-3.5.0` - the versioned Airflow image with
default Python version (3.14 currently)
* `apache/airflow:slim-3.5.0-pythonX.Y` - the versioned Airflow image with
specific Python version
The Apache Airflow image provided as convenience package is optimized for
size, and
diff --git a/docker-stack-docs/build-arg-ref.rst
b/docker-stack-docs/build-arg-ref.rst
index 5e10789441c..3634c64c9dc 100644
--- a/docker-stack-docs/build-arg-ref.rst
+++ b/docker-stack-docs/build-arg-ref.rst
@@ -116,7 +116,7 @@ Those are the most common arguments that you use when you
want to build a custom
functionality - only added confusion - so it has been removed.
The default ``BASE_IMAGE`` is Airflow's public mirror of the `Docker Hardened
Image <https://dhi.io>`_ for
-Python - for Airflow |airflow-version| that is
``ghcr.io/apache/airflow/base/python:3.13.18-debian13-dev``,
+Python - for Airflow |airflow-version| that is
``ghcr.io/apache/airflow/base/python:3.14.10-debian13-dev``,
pinned to the digest the Airflow CI last passed on (see :ref:`the hardened
base images <image-hardened-base>`). Pulling the mirror needs no
credentials; pulling ``dhi.io`` directly requires a ``docker login dhi.io``.
diff --git a/docker-stack-docs/build.rst b/docker-stack-docs/build.rst
index 5dabf354b5d..6c35bf8f70d 100644
--- a/docker-stack-docs/build.rst
+++ b/docker-stack-docs/build.rst
@@ -316,9 +316,9 @@ Naming conventions for the images:
+----------------+--------------------------+---------------------------------+--------------------------------------+
| Image | Python | Standard image
| Slim image |
+================+==========================+=================================+======================================+
-| Latest default | 3.13 | apache/airflow:latest
| apache/airflow:slim-latest |
+| Latest default | 3.14 | apache/airflow:latest
| apache/airflow:slim-latest |
+----------------+--------------------------+---------------------------------+--------------------------------------+
-| Default | 3.13 | apache/airflow:X.Y.Z
| apache/airflow:slim-X.Y.Z |
+| Default | 3.14 | apache/airflow:X.Y.Z
| apache/airflow:slim-X.Y.Z |
+----------------+--------------------------+---------------------------------+--------------------------------------+
| Latest | 3.11,3.12,3.13,3.14 | apache/airflow:latest-pythonN.M
| apache/airflow:slim-latest-pythonN.M |
+----------------+--------------------------+---------------------------------+--------------------------------------+
diff --git a/docker-stack-docs/changelog.rst b/docker-stack-docs/changelog.rst
index 79454aa9a66..57dde6ec9e7 100644
--- a/docker-stack-docs/changelog.rst
+++ b/docker-stack-docs/changelog.rst
@@ -34,6 +34,13 @@ the Airflow team.
any Airflow version from the ``Airflow 2`` line. There is no guarantee
that it will work, but if it does,
then you can use latest features from that image to build images for
previous Airflow versions.
+Airflow 3.5.0
+~~~~~~~~~~~~~
+
+ * The default Python version of the image changed from 3.13 to 3.14. The
images without a
+ ``-pythonX.Y`` suffix - such as ``apache/airflow:3.5.0``, ``latest`` and
their ``slim-`` variants -
+ now use Python 3.14. Use the ``-python3.13`` images to stay on Python 3.13.
+
Airflow 3.4.0
~~~~~~~~~~~~~
diff --git
a/docker-stack-docs/docker-examples/customizing/add-build-essential-custom.sh
b/docker-stack-docs/docker-examples/customizing/add-build-essential-custom.sh
index 8a6ea470e10..1af111f0115 100755
---
a/docker-stack-docs/docker-examples/customizing/add-build-essential-custom.sh
+++
b/docker-stack-docs/docker-examples/customizing/add-build-essential-custom.sh
@@ -31,7 +31,7 @@ export DOCKER_BUILDKIT=1
docker build . \
--pull \
- --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.13.18-debian13-dev}"
\
+ --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.14.10-debian13-dev}"
\
--build-arg AIRFLOW_VERSION="${AIRFLOW_VERSION}" \
--build-arg ADDITIONAL_PYTHON_DEPS="mpi4py==4.1.1" \
--build-arg ADDITIONAL_DEV_APT_DEPS="libopenmpi-dev" \
diff --git a/docker-stack-docs/docker-examples/customizing/custom-sources.sh
b/docker-stack-docs/docker-examples/customizing/custom-sources.sh
index ea40788ea1a..271f34214b6 100755
--- a/docker-stack-docs/docker-examples/customizing/custom-sources.sh
+++ b/docker-stack-docs/docker-examples/customizing/custom-sources.sh
@@ -32,7 +32,7 @@ export DOCKER_BUILDKIT=1
docker build . -f Dockerfile \
--pull \
--platform 'linux/amd64' \
- --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.13.18-debian13-dev}"
\
+ --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.14.10-debian13-dev}"
\
--build-arg AIRFLOW_VERSION="${AIRFLOW_VERSION}" \
--build-arg ADDITIONAL_AIRFLOW_EXTRAS="slack,odbc" \
--build-arg ADDITIONAL_PYTHON_DEPS=" \
diff --git
a/docker-stack-docs/docker-examples/customizing/pypi-dev-runtime-deps.sh
b/docker-stack-docs/docker-examples/customizing/pypi-dev-runtime-deps.sh
index 22b87c7a5a3..8d3dde9ad2e 100755
--- a/docker-stack-docs/docker-examples/customizing/pypi-dev-runtime-deps.sh
+++ b/docker-stack-docs/docker-examples/customizing/pypi-dev-runtime-deps.sh
@@ -32,7 +32,7 @@ export DOCKER_BUILDKIT=1
docker build . \
--pull \
- --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.13.18-debian13-dev}"
\
+ --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.14.10-debian13-dev}"
\
--build-arg AIRFLOW_VERSION="${AIRFLOW_VERSION}" \
--build-arg ADDITIONAL_AIRFLOW_EXTRAS="jdbc" \
--build-arg ADDITIONAL_PYTHON_DEPS="pandas==2.1.2" \
diff --git
a/docker-stack-docs/docker-examples/customizing/pypi-extras-and-deps.sh
b/docker-stack-docs/docker-examples/customizing/pypi-extras-and-deps.sh
index a9f5ea6f967..72536535a8a 100755
--- a/docker-stack-docs/docker-examples/customizing/pypi-extras-and-deps.sh
+++ b/docker-stack-docs/docker-examples/customizing/pypi-extras-and-deps.sh
@@ -31,7 +31,7 @@ export DOCKER_BUILDKIT=1
docker build . \
--pull \
- --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.13.18-debian13-dev}"
\
+ --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.14.10-debian13-dev}"
\
--build-arg AIRFLOW_VERSION="${AIRFLOW_VERSION}" \
--build-arg ADDITIONAL_AIRFLOW_EXTRAS="mssql,hdfs" \
--build-arg ADDITIONAL_PYTHON_DEPS="oauth2client" \
diff --git
a/docker-stack-docs/docker-examples/customizing/pypi-selected-version.sh
b/docker-stack-docs/docker-examples/customizing/pypi-selected-version.sh
index a6b519ef175..bf82b0483a9 100755
--- a/docker-stack-docs/docker-examples/customizing/pypi-selected-version.sh
+++ b/docker-stack-docs/docker-examples/customizing/pypi-selected-version.sh
@@ -30,7 +30,7 @@ export AIRFLOW_VERSION=3.0.3
export DOCKER_BUILDKIT=1
docker build . \
- --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.13.18-debian13-dev}"
\
+ --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.14.10-debian13-dev}"
\
--build-arg AIRFLOW_VERSION="${AIRFLOW_VERSION}" \
--tag "my-pypi-selected-version:0.0.1"
# [END build]
diff --git
a/docker-stack-docs/docker-examples/restricted/restricted_environments.sh
b/docker-stack-docs/docker-examples/restricted/restricted_environments.sh
index cbcff085057..995147decf0 100755
--- a/docker-stack-docs/docker-examples/restricted/restricted_environments.sh
+++ b/docker-stack-docs/docker-examples/restricted/restricted_environments.sh
@@ -47,7 +47,7 @@ export DOCKER_BUILDKIT=1
docker build . \
--pull \
- --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.13.18-debian13-dev}"
\
+ --build-arg
BASE_IMAGE="${BASE_IMAGE:-ghcr.io/apache/airflow/base/python:3.14.10-debian13-dev}"
\
--build-arg AIRFLOW_INSTALLATION_METHOD="apache-airflow" \
--build-arg AIRFLOW_VERSION="${AIRFLOW_VERSION}" \
--build-arg INSTALL_MYSQL_CLIENT="false" \
diff --git a/docker-stack-docs/index.rst b/docker-stack-docs/index.rst
index ee5ee1a89a0..d3093de3afc 100644
--- a/docker-stack-docs/index.rst
+++ b/docker-stack-docs/index.rst
@@ -62,9 +62,9 @@ The same applies to the "slim" images.
You can find the following images there (Assuming Airflow version
:subst-code:`|airflow-version|`):
-* :subst-code:`apache/airflow:latest` - the latest released
Airflow image with default Python version (3.12 currently)
+* :subst-code:`apache/airflow:latest` - the latest released
Airflow image with default Python version (3.14 currently)
* :subst-code:`apache/airflow:latest-pythonX.Y` - the latest released
Airflow image with specific Python version
-* :subst-code:`apache/airflow:|airflow-version|` - the versioned
Airflow image with default Python version (3.12 currently)
+* :subst-code:`apache/airflow:|airflow-version|` - the versioned
Airflow image with default Python version (3.14 currently)
* :subst-code:`apache/airflow:|airflow-version|-pythonX.Y` - the versioned
Airflow image with specific Python version
Those are "reference" regular images. They contain the most common set of
extras, dependencies and providers that are
@@ -74,9 +74,9 @@ You can also use "slim" images that contain only core Airflow
and are about half
but you need to add all the :doc:`apache-airflow:extra-packages-ref` and
providers that you need separately
via :ref:`Building the image <build:build_image>`.
-* :subst-code:`apache/airflow:slim-latest` - the latest released
Airflow image with default Python version (3.12 currently)
+* :subst-code:`apache/airflow:slim-latest` - the latest released
Airflow image with default Python version (3.14 currently)
* :subst-code:`apache/airflow:slim-latest-pythonX.Y` - the latest released
Airflow image with specific Python version
-* :subst-code:`apache/airflow:slim-|airflow-version|` - the
versioned Airflow image with default Python version (3.12 currently)
+* :subst-code:`apache/airflow:slim-|airflow-version|` - the
versioned Airflow image with default Python version (3.14 currently)
* :subst-code:`apache/airflow:slim-|airflow-version|-pythonX.Y` - the
versioned Airflow image with specific Python version
The Apache Airflow image provided as convenience package is optimized for
size, and