2025, Dec 21 15:15
Airflow в Docker падает с ModuleNotFoundError: фиксируем Flask-Session ниже 0.6
Apache Airflow 2.7.3 в Docker падает с ModuleNotFoundError из-за Flask-Session. Объясняем причину и даем решение: зафиксировать Flask-Session на версии ниже 0.6.
Собрать Apache Airflow в один Docker-образ удобно — до тех пор, пока незаметное обновление зависимости не выбивает почву из-под ног. Частый симптом: контейнер запускается и тут же завершается с ошибкой импорта, связанной с Flask-Session, хотя вы установили пакет явно.
Симптом
При старте контейнера Airflow падает на этапе инициализации со следующим сообщением:
ModuleNotFoundError: No module named 'flask_session.sessions'
Пакет вроде бы установлен, но процесс всё равно завершается при попытке Airflow импортировать веб-слой.
Минимальный Dockerfile, воспроизводящий сбой
Ниже приведён Dockerfile, который ставит Airflow 2.7.3 и подтягивает актуальную версию Flask-Session. Несмотря на наличие Flask-Session, образ завершается с указанной выше ошибкой.
FROM python:3.10.13-slim-bullseye
ENV DEBIAN_FRONTEND=noninteractive
ENV TERM=linux
ARG AF_VER=2.7.3
ARG AF_EXTRAS=""
ARG EXTRA_PY_PKGS=""
ENV AIRFLOW_HOME=/usr/local/airflow
ENV LANGUAGE=en_US.UTF-8
ENV LANG=en_US.UTF-8
ENV LC_ALL=en_US.UTF-8
ENV LC_CTYPE=en_US.UTF-8
ENV LC_MESSAGES=en_US.UTF-8
ENV AIRFLOW__CORE__EXECUTOR=LocalExecutor
RUN set -ex \
&& compile_apt=' \
freetds-dev \
libkrb5-dev \
libsasl2-dev \
libssl-dev \
libffi-dev \
libpq-dev \
' \
&& apt-get update -yqq \
&& apt-get upgrade -yqq \
&& apt-get install -yqq --no-install-recommends \
$compile_apt \
freetds-bin \
build-essential \
default-libmysqlclient-dev \
unixodbc-dev \
apt-utils \
curl \
rsync \
netcat \
locales \
sudo \
git \
krb5-user \
openssh-client \
&& apt-get install -y gnupg2 apt-transport-https curl \
&& curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
&& curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list \
&& apt-get update \
&& ACCEPT_EULA=Y apt-get install -y msodbcsql17 \
&& ACCEPT_EULA=Y apt-get install -y mssql-tools \
&& echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc \
&& sed -i 's/^# en_US.UTF-8 UTF-8$/en_US.UTF-8 UTF-8/g' /etc/locale.gen \
&& locale-gen \
&& update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 \
&& useradd -ms /bin/bash -d /usr/local/airflow airflow \
&& pip install -U pip setuptools wheel \
&& pip install 'SQLAlchemy==1.3.23' \
&& pip install 'Flask-SQLAlchemy==2.4.4' \
&& pip install pytz \
&& pip install pyOpenSSL \
&& pip install ndg-httpsclient \
&& pip install pyasn1 \
&& pip install openpyxl \
&& pip install pyodbc \
&& pip install pysmb \
&& pip install twilio \
&& pip install oauth2client \
&& pip install googleads \
&& pip install twitter_ads \
&& pip install google-api-python-client \
&& pip install virtualenv \
&& pip install 'werkzeug<1.0.0' \
&& pip install 'email-validator' \
&& pip install "apache-airflow[crypto,celery,hive,jdbc,ssh]==2.7.3" \
&& pip install 'redis==3.2' \
&& pip install 'Flask-Session' \
&& pip install facebook_business \
&& if [ -n "${EXTRA_PY_PKGS}" ]; then pip install ${EXTRA_PY_PKGS}; fi \
&& apt-get purge --auto-remove -yqq $compile_apt \
&& apt-get autoremove -yqq --purge \
&& apt-get clean \
&& rm -rf \
/var/lib/apt/lists/* \
/tmp/* \
/var/tmp/* \
/usr/share/man \
/usr/share/doc \
/usr/share/doc-base
В чём причина
Во время поднятия веб-слоя Airflow пытается импортировать SqlAlchemySessionInterface из flask_session.sessions. Пакет на месте, но свежий релиз Flask-Session не совместим с используемой версией Airflow. В итоге путь импорта не разрешается, и процесс завершается с ModuleNotFoundError. Ограничение Flask-Session более старой веткой устраняет несовместимость.
Решение
Зафиксируйте Flask-Session на версии ниже 0.6. С таким ограничением контейнер запускается, и Airflow инициализируется штатно.
FROM python:3.10.13-slim-bullseye
ENV DEBIAN_FRONTEND=noninteractive
ENV TERM=linux
ARG AF_VER=2.7.3
ARG AF_EXTRAS=""
ARG EXTRA_PY_PKGS=""
ENV AIRFLOW_HOME=/usr/local/airflow
ENV LANGUAGE=en_US.UTF-8
ENV LANG=en_US.UTF-8
ENV LC_ALL=en_US.UTF-8
ENV LC_CTYPE=en_US.UTF-8
ENV LC_MESSAGES=en_US.UTF-8
ENV AIRFLOW__CORE__EXECUTOR=LocalExecutor
RUN set -ex \
&& compile_apt=' \
freetds-dev \
libkrb5-dev \
libsasl2-dev \
libssl-dev \
libffi-dev \
libpq-dev \
' \
&& apt-get update -yqq \
&& apt-get upgrade -yqq \
&& apt-get install -yqq --no-install-recommends \
$compile_apt \
freetds-bin \
build-essential \
default-libmysqlclient-dev \
unixodbc-dev \
apt-utils \
curl \
rsync \
netcat \
locales \
sudo \
git \
krb5-user \
openssh-client \
&& apt-get install -y gnupg2 apt-transport-https curl \
&& curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
&& curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list \
&& apt-get update \
&& ACCEPT_EULA=Y apt-get install -y msodbcsql17 \
&& ACCEPT_EULA=Y apt-get install -y mssql-tools \
&& echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc \
&& sed -i 's/^# en_US.UTF-8 UTF-8$/en_US.UTF-8 UTF-8/g' /etc/locale.gen \
&& locale-gen \
&& update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 \
&& useradd -ms /bin/bash -d /usr/local/airflow airflow \
&& pip install -U pip setuptools wheel \
&& pip install 'SQLAlchemy==1.3.23' \
&& pip install 'Flask-SQLAlchemy==2.4.4' \
&& pip install pytz \
&& pip install pyOpenSSL \
&& pip install ndg-httpsclient \
&& pip install pyasn1 \
&& pip install openpyxl \
&& pip install pyodbc \
&& pip install pysmb \
&& pip install twilio \
&& pip install oauth2client \
&& pip install googleads \
&& pip install twitter_ads \
&& pip install google-api-python-client \
&& pip install virtualenv \
&& pip install 'werkzeug<1.0.0' \
&& pip install 'email-validator' \
&& pip install "apache-airflow[crypto,celery,hive,jdbc,ssh]==2.7.3" \
&& pip install 'redis==3.2' \
&& pip install 'Flask-Session<0.6' \
&& pip install facebook_business \
&& if [ -n "${EXTRA_PY_PKGS}" ]; then pip install ${EXTRA_PY_PKGS}; fi \
&& apt-get purge --auto-remove -yqq $compile_apt \
&& apt-get autoremove -yqq --purge \
&& apt-get clean \
&& rm -rf \
/var/lib/apt/lists/* \
/tmp/* \
/var/tmp/* \
/usr/share/man \
/usr/share/doc \
/usr/share/doc-base
Если та же ошибка возникает в другом окружении, сначала убедитесь, что пакет flask_session действительно установлен. Если он уже есть и вы используете эту линейку Airflow, ограничение Flask-Session ниже 0.6 решает проблему с путём импорта.
Почему это важно
Незафиксированные зависимости легко превращают стабильный образ в падающий — буквально от сборки к сборке. Воспроизводимость критична для конвейеров CI/CD и предсказуемого поведения контейнеров на серверах. Небольшие ограничения по версиям часто определяют, будет ли релиз гладким или закончится отладкой в проде.
Вывод
Если контейнер Airflow завершается с ошибкой “No module named 'flask_session.sessions'”, несмотря на установленный Flask-Session, зафиксируйте Flask-Session на версии ниже 0.6. Это приведёт его в соответствие с используемой версией Airflow и вернёт корректный старт. В дальнейшем стоит закреплять версии ключевых Python-зависимостей, чтобы сохранять детерминированность образов.