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-зависимостей, чтобы сохранять детерминированность образов.