You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

apache/airflow镜像中运行容器化任务遭遇OSError问题排查请求

Airflow Docker Task执行报错:OSError: [Errno 88] Socket operation on non-socket

问题场景

我尝试通过以下Python脚本在apache/airflow镜像中运行简单任务:

from airflow.sdk import dag, task

@task.docker(
    image="docker.1ms.run/apache/airflow:3.2.0-python3.11"
    # Note. It is just a mirror of apache/airflow:3.2.0-python3.11
)
def foo():
    print("Foo")

@dag(dag_id="minwe_dag")
def minwe_dag():
    foo()

minwe_dag()

但任务执行失败,抛出OSError,日志错误信息:

[2026-04-09 12:38:47] INFO - OSError: [Errno 88] Socket operation on non-socket

错误发生在airflow/sdk/execution_time/task_runner.py的reinit_supervisor_comms函数中,通过文件描述符创建socket时出错。另外,在未安装apache-airflow Python包的其他Docker容器中运行相同DAG可正常执行。

问题原因

核心原因是嵌套Airflow环境的IPC机制冲突:

  • 当前运行环境本身就是apache/airflow镜像(已完整安装apache-airflow包),而@task.docker又启动了同版本的Airflow容器作为任务执行环境。
  • 内部容器启动时,Airflow SDK会尝试复用外部环境的进程间通信(IPC)文件描述符,但这些描述符在内部容器中并不对应有效的socket,最终触发Errno 88错误。
  • 在未安装apache-airflow的容器中运行时,外部环境没有Airflow的IPC机制,SDK会从头初始化通信通道,因此不会出现冲突。

解决方案

方案1:避免嵌套Airflow环境

如果任务不需要依赖Airflow环境,直接使用基础Python镜像作为@task.docker的运行镜像:

@task.docker(
    image="python:3.11-slim"
)
def foo():
    print("Foo")

方案2:任务依赖Airflow时调整执行方式

  • 直接使用普通@task装饰器,让任务在当前Airflow环境中执行,无需启动嵌套容器。
  • 若必须用容器,自定义仅包含任务所需Airflow依赖的精简镜像,避免完整apache/airflow镜像带来的IPC冲突。

内容的提问来源于stack exchange,提问作者Alexander Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:24:54