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

为何Docker Swarm Operator在DAG运行结束时检查容器致任务失败?

问题:Airflow DockerSwarmOperator 因跨节点容器查找失败导致DAG报错

环境配置

  • 3节点Docker Swarm集群:1个管理节点 + 2个工作节点
  • 管理节点配置为在2375端口暴露Docker API,该地址作为DockerSwarmOperator的docker_url参数传入
  • Airflow通过Docker Compose部署在Swarm管理节点上

DAG 运行代码

import datetime

from airflow import DAG
from airflow.providers.docker.operators.docker_swarm import DockerSwarmOperator
from docker.types import Mount, NetworkAttachmentConfig

with DAG(
    dag_id="movie_retriever_dag",
    start_date=datetime.datetime(2025, 1, 4),
):
    extraction_container = DockerSwarmOperator(
        task_id="movie-extract_transform_load",
        image="movie-extract_transform_load-image:latest",
        command="python ./extract_transform_load.py -t \"{{ dag_run.conf['title'] }}\"",
        mount_tmp_dir=False,
        mounts=[
            Mount(
                target="/app/temp_data",
                source="/mnt/storage-server0/sda3/airflow/tmp",
                type="bind",
            ),
            Mount(
                target="/app/appdata/db.sqlite",
                source="/mnt/storage-server0/sda3/portfolio/data/db.sqlite",
                type="bind",
            ),
        ],
        auto_remove=True,
        networks=[NetworkAttachmentConfig(target="grafana_loki")],
        docker_url="tcp://192.168.0.173:2375",
    )

    extraction_container

实际运行流程

  1. DAG启动运行
  2. 成功在Swarm集群中创建服务
  3. 服务调度到某工作节点运行容器,容器成功完成所有操作
  4. DAG执行失败,抛出404错误

错误日志

[2025-01-12, 22:05:30 CET] {docker_swarm.py:205} INFO - Service status before exiting: complete
[2025-01-12, 22:05:30 CET] {taskinstance.py:3311} ERROR - Task failed with exception
Traceback (most recent call last):
  File "/home/airflow/.local/lib/python3.12/site-packages/docker/api/client.py", line 275, in _raise_for_status
    response.raise_for_status()
  File "/home/airflow/.local/lib/python3.12/site-packages/requests/models.py", line 1024, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: http://192.168.0.173:2375/v1.47/containers/6ec661d35385d58aa9e91e7b8a0e6e03fe920f8f8ba079a7cdf7cfdd12fe2e0f/json

经排查,报错中查找的容器ID6ec661d35385d58aa9e91e7b8a0e6e03fe920f8f8ba079a7cdf7cfdd12fe2e0f实际运行在Swarm工作节点上,管理节点无法直接查询到该容器信息。

核心疑问

  • DockerSwarmOperator为什么要发起针对特定容器的HTTP请求?
  • 既然是Swarm集群环境,为什么不通过检查服务的状态来判断任务是否完成,而是去查询单个容器?
  • 当前Airflow的部署方式(在管理节点用Docker Compose部署)是否是导致这个问题的原因?

内容的提问来源于stack exchange,提问作者Iyad Elwy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:36:19