为何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
实际运行流程
- DAG启动运行
- 成功在Swarm集群中创建服务
- 服务调度到某工作节点运行容器,容器成功完成所有操作
- 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
相关产品推荐
相关产品推荐

